Android Java SHA256和C#SHA256给出不同的值

发布于 2025-01-20 05:38:33 字数 1097 浏览 3 评论 0原文

Android Java SHA256和C#SHA256给出不同的值。我希望Java和C#相同。

C#代码:

private static string _getHashSha256(string inputString)
{
    string hashString = string.Empty;
    using (SHA256Managed hashstring = new SHA256Managed())
    {
        byte[] bytes = UTF32Encoding.UTF32.GetBytes(inputString);
        byte[] hash = hashstring.ComputeHash(bytes);
        foreach (byte x in hash)
            hashString += String.Format("{0:x2}", x);
    }
    return hashString;
}

input "111", result "f4b5625de0c6abd88521b87d39f5a4fe33935f27c4ac38a63575ad43d36c7fbb"

Android Java代码:

String password="111";
MessageDigest digest=null;
String hash;
try {
    digest = MessageDigest.getInstance("SHA-256");
    digest.update(password.getBytes("UTF-32"));

    hash = bytesToHexString(digest.digest());

    Log.i("sha256", hash);
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e1) {
    z = "hash code error: " + e1.getMessage();
}

input is "111". result "12215d42454c57aa1039367b66509e53dcd2d6f9a6e80f9d00b2439ea7ebd43f"

请帮助我!

Android java SHA256 and C# sha256 give different values. I want java to be same as c#.

c# code:

private static string _getHashSha256(string inputString)
{
    string hashString = string.Empty;
    using (SHA256Managed hashstring = new SHA256Managed())
    {
        byte[] bytes = UTF32Encoding.UTF32.GetBytes(inputString);
        byte[] hash = hashstring.ComputeHash(bytes);
        foreach (byte x in hash)
            hashString += String.Format("{0:x2}", x);
    }
    return hashString;
}

input "111", result "f4b5625de0c6abd88521b87d39f5a4fe33935f27c4ac38a63575ad43d36c7fbb"

android java code:

String password="111";
MessageDigest digest=null;
String hash;
try {
    digest = MessageDigest.getInstance("SHA-256");
    digest.update(password.getBytes("UTF-32"));

    hash = bytesToHexString(digest.digest());

    Log.i("sha256", hash);
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e1) {
    z = "hash code error: " + e1.getMessage();
}

input is "111". result "12215d42454c57aa1039367b66509e53dcd2d6f9a6e80f9d00b2439ea7ebd43f"

please help me guys!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

太傻旳人生 2025-01-27 05:38:33

谢谢你们。
我发现问题是当java通过utf-32将字符串转换为字节时,前面有额外的4个字节。它改变了生成的 sha256。
所以我删除了最初的 4 个字节,如下所示:

String password="111";
MessageDigest digest=null;
String hash;

byte[] bbb = user_pass.getBytes("UTF-32");
byte[] ccc = new byte[bbb.length - 4];
System.arraycopy(bbb, 4, ccc, 0, bbb.length - 4);

digest = MessageDigest.getInstance("SHA-256");
digest.update(ccc);

hash_password = bytesToHexString(digest.digest());

Thanks guys.
I found the problem was when java converts string to bytes by utf-32, there is additional 4 bytes preceded. it changed resulting sha256.
So I removed that initial 4 bytes as follows:

String password="111";
MessageDigest digest=null;
String hash;

byte[] bbb = user_pass.getBytes("UTF-32");
byte[] ccc = new byte[bbb.length - 4];
System.arraycopy(bbb, 4, ccc, 0, bbb.length - 4);

digest = MessageDigest.getInstance("SHA-256");
digest.update(ccc);

hash_password = bytesToHexString(digest.digest());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文