3

对于应用程序原型,我正在创建一个简单的用户登录。然后将使用 sha224 对用户的密码进行哈希处理并传输到后端。我现在面临的问题如下。存储在数据库中的密码(也使用 sha224 散列)似乎与我发送的散列有点不同。我使用以下代码来创建哈希。

给定密码 == 测试

Python

from hashlib import sha224
sha224("test").hexdigest()

安卓

MessageDigest sha224 = MessageDigest.getInstance("SHA-224");
sha224.update(key.getBytes());

byte[] digest = sha224.digest();
StringBuffer buffer = new StringBuffer();

for(int i = 0; i < digest.length; i++) {
 buffer.append(String.valueOf(Integer.toHexString(0xFF & digest[i])));
}

return buffer.toString();

现在将生成的内容如下所示,我将两个散列直接发布在彼此下方。(第一个是python,第二个是android)

90a3ed9e32b2aaf4c61c410eb925426119e1a9dc53d4286ade99a809 90a3ed9e32b2aaf4c61c41eb925426119e1a9dc53d4286ade99a89

它们几乎相同,但 python 哈希值多了两个 0。你们知道为什么吗?

4

3 回答 3

4

您没有正确格式化 Android 上的十六进制值;前导 0 被丢弃。

buffer.append(String.format("%02x", 0xFF & digest[i]));
于 2010-11-15T13:28:21.703 回答
0
final MessageDigest mDigest = MessageDigest.getInstance("SHA-224");
byte[] messageDigest = mDigest.digest(toEncrypt.getBytes());
final BigInteger number = new BigInteger(1, messageDigest);
final String sha = number.toString(16);
final int diff = 32 - sha.length();
final StringBuilder finalSHA = new StringBuilder(32);
for (int i=0;i<diff;i++) {
 finalSHA.append("0");
}
finalSHA.append(sha);
return finalSHA.toString();
于 2010-11-15T13:35:52.193 回答
0

您一次将 2 对的十六进制转换为字符串。丢弃的第一个零位于第 23 位,即奇数位置。这是一个前导零。您需要在必要时对转换后的十六进制数字进行零填充。没有 BigInteger 的替代实现:

MessageDigest sha224 = MessageDigest.getInstance("SHA-224");
sha224.update(key.getBytes());

byte[] digest = sha224.digest();
StringBuffer buffer = new StringBuffer();

for(int i = 0; i < digest.length; i++) {
  String hex_string = Integer.toHexString(0xFF & digest[i]);
  if(hex_string.length()==1) hex_string = "0"+hex_string;
  buffer.append(hex_string);
}

return buffer.toString();
于 2010-11-15T13:40:13.020 回答