java - 无法创建正确的 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
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));

}

我必须比较的最终哈希看起来像这样

6d0af38001b278389875d2119a187ac5d4df16f5dd75fa5272499059c1149803

但是我的逻辑创建的哈希永远不会与原始哈希匹配。

过去两天我一直在为此苦苦挣扎。任何帮助将不胜感激。提前致谢

最佳答案

抱歉回复晚了。我认为您已经解决了您的问题。希望这个答案可以帮助任何仍在寻找答案的人。

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;
    }
}

使用 Apache Commons-Codec 进行哈希处理(实现“commons-codec:commons-codec:1.14”)。

关于java - 无法创建正确的 SHA256 哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56803256/

相关文章:

java - 如何使用 Java 在 Windows 中比较 Fedora iso 下载文件与其 sha-256 校验和文本文件?

c++ - 如何使用 OpenSSL 库生成 RSA-SHA256 数字签名?

java - 不知道如何打印这个?

java - 无法弄清楚如何使用 isAnimationFinished() 方法(LibGDX)

android - "GeofencingAPI is deprecated"

java - 如何使用 Okhttp3 (REST API) 上传文件

Android 应用程序在被杀死时不调用 "onDestroy()"(ICS)

java - 使用Java和sikuli对Excel进行排序并粘贴到网页上

java - 提取 "="之后和 "&"之前的内容,java中的正则表达式

security - SHA256 安全问题