我需要使用这个C#代码并在android中生成相同的哈希:
string result = "2-" + Convert.ToBase64String(new SHA1CryptoServiceProvider().ComputeHash(Encoding.Unicode.GetBytes(password)));
我正在尝试将这个完成数小时,并且仍然会散列不同的代码。 谢谢你的回答。
答案 0 :(得分:0)
我们走了:
try {
String password = "qwkld67U";
MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
sha1.update(password.getBytes("UTF-16LE"));
String result = "2-" + Base64.encodeToString(sha1.digest(), Base64.DEFAULT);
Log.i("SHA1", result);
} catch (Exception e) {
throw new RuntimeException(e);
}
输出结果为:
I/SHA1: 2-BePLL+2eth1YOoIcbA5sfzD8Yuw=
大多数人都认为字符串编码错误。 .NET中的Encoding.Unicode
是一种没有字节顺序标记的UTF-16编码。 Java等价物是UTF-16LE
(而不仅仅是UTF-16
,它在开头有一个字节顺序标记。)
关于安全反模式。我知道你不在乎。但它可能比我在评论中所怀疑的更糟糕(没有盐的哈希)。如果将散列密码发送到服务器并将其与散列密码进行比较,则首先会破坏密码散列的目的。通过加密连接传输明文密码比传输哈希密码要好得多。让那些负责安全设计的人知道。