Java 无法创建正确的SHA256哈希

Java 无法创建正确的SHA256哈希,java,android,sha256,Java,Android,Sha256,我正在从事一个项目,我需要按照下面所示的步骤创建一个SHA256散列,并将其与现有散列进行比较以进行验证 以下是创建哈希的步骤: Hashing logic for Mobile Number : Sha256(Sha256(Mobile+SharePhrase))*number of times last digit of Aadhaar number (Ref ID field contains last 4 digits). Example : Mobile: 1234567890

我正在从事一个项目,我需要按照下面所示的步骤创建一个SHA256散列,并将其与现有散列进行比较以进行验证

以下是创建哈希的步骤:

Hashing logic for Mobile Number : 
Sha256(Sha256(Mobile+SharePhrase))*number of times last digit of Aadhaar number
(Ref ID field contains last 4 digits).

Example : 
Mobile: 1234567890
Aadhaar Number:XXXX XXXX 3632
Passcode : Lock@487
Hash: Sha256(Sha256(1234567890Lock@487))*2 
我是这样做的

byte[] digCloneOutput = new byte[32];
private void getPhoneHash(String numberToHash) {

    String phn = (getPhn+""+ed_shareCode.getText().toString().trim());

    Log.e("phn", phn);

    MessageDigest md = null;

    byte[] digest;
    byte[] digClone = new byte[0];

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
        digest = phn.getBytes(Charset.forName("UTF-8"));
        digClone = digest.clone();
    }

    try
    {
        md = MessageDigest.getInstance("SHA-256");
    }
    catch (NoSuchAlgorithmException e)
    {
        throw new IllegalStateException("SHA-256 hash should be available", e);
    }

    for(int i = 0; i< 2; i++){
        md.update(digClone);
        digClone = md.digest();
        Log.e("Intermediate hash",""+ digClone);
    }


    for (int i = 0; i < digClone.length; i++)
    {

        digCloneOutput[i] = (byte) (digClone[i]*lastDigAdhr);
        //  md.update(digClone);
        //  printDigest("Intermediate hash", digClone);
    }

    printDigest( digCloneOutput);
}


public  void printDigest(byte[] digest)
{
    StringBuffer hexString = new StringBuffer();
    for (int i = 0; i < digest.length; i++) {
    String hex = Integer.toHexString(0xff & digest[i]);
    if(hex.length() == 1) hexString.append('0');
    hexString.append(hex);
}

    Log.e("Final HashString to compare", String.valueOf(hexString));

}
byte[]digCloneOutput=新字节[32];
私有void getPhoneHash(字符串numberToHash){
字符串phn=(getPhn+“”+ed_shareCode.getText().toString().trim());
Log.e(“phn”,phn);
MessageDigest md=null;
字节[]摘要;
byte[]digClone=新字节[0];
if(android.os.Build.VERSION.SDK\u INT>=android.os.Build.VERSION\u code.KITKAT){
digest=phn.getBytes(Charset.forName(“UTF-8”);
digClone=digest.clone();
}
尝试
{
md=MessageDigest.getInstance(“SHA-256”);
}
捕获(无算法异常)
{
抛出新的IllegalStateException(“SHA-256哈希应该可用”,e);
}
对于(int i=0;i<2;i++){
md.update(digClone);
digClone=md.digest();
Log.e(“中间哈希”,即“+digClone”);
}
for(int i=0;i
我要比较的最后一个散列如下

6d0af38001b278389875d2119a187ac5d4df16f5dd75fa5272499059c1149803

但是由我的逻辑创建的哈希与原始哈希不匹配


从过去的两天开始,我一直在努力。任何帮助都将不胜感激。提前感谢SHA-256,我使用这个简单的代码,希望它能帮助您

fun encryptToSha256(data: String): String {
    val digest = MessageDigest.getInstance("SHA-256")
    digest.update(data.toByteArray())
    return bytesToHexString(digest.digest())
}

private fun bytesToHexString(bytes: ByteArray): String {
    val sb = StringBuffer()
    for (i in bytes.indices) {
        val hex = Integer.toHexString(0xFF and bytes[i].toInt())
        if (hex.length == 1) {
            sb.append('0')
        }
        sb.append(hex)
    }
    return sb.toString()
}

对不起,我迟了答复。我想你已经解决了你的问题。希望这个答案能帮助那些仍在寻找答案的人

Aadhar网站有非常模糊的文档,这使得它更难开发。 我们中的大多数人都会在看到以下语句时感到困惑:
Sha256(Sha256(Mobile+SharePhrase))*Aadhaar号码最后一位数字的次数
(至少我感到困惑)。所以我不得不使用试错法来验证散列,结果证明它是简单的逻辑。您只需使用Zip密码连接手机,并将结果字符串乘以aadhaar编号的最后一位数字进行哈希运算。您可以使用以下代码进行相同操作:

private boolean isHashMatched(String mobileNo, String zipPassword, String 
    hashedMobile ,int aadharLastDigit){
    String concatedString  = mobileNo + zipPassword;
    aadharLastDigit = aadharLastDigit == 0 ? 1 : aadharLastDigit; //if last 
    //digit is "0", hash only one time.
    try {
        for(int i = 0; i < aadharLastDigit; i++){
            concatedString = DigestUtils.sha256Hex(concatedString);
        }
        return hashedMobile.equals(concatedString);
    }catch (Exception e){
        e.printStackTrace();
        return false;
    }
}
private boolean isHashMatched(字符串mobileNo、字符串zipPassword、字符串
hashedMobile,int-aadharLastDigit){
字符串concatedString=mobileNo+zipPassword;
aadharLastDigit=aadharLastDigit==0?1:aadharLastDigit;//如果最后一个
//数字为“0”,仅散列一次。
试一试{
对于(int i=0;i

使用Apache Commons编解码器进行哈希运算(
实现“Commons编解码器:Commons编解码器:1.14”
)。

谢谢您的回答。。请检查我所需的哈希逻辑,并检查我的代码以了解差距。。