对于应用程序原型,我正在创建一个简单的用户登录。然后,将使用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 90A3ED9E32B2AAF4C61C61C41C41C41EB925426119E1A9DC5C53DC53D4286ADE999SADADE999ADADE999AEN9N9

它们几乎相同,但是Python Hash有两个0。你们知道为什么吗?

有帮助吗?

解决方案

您不会正确地格式化Android上的十六进制值;领先0被丢弃。

buffer.append(String.format("%02x", 0xFF & digest[i]));

其他提示

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();

您一次将十六进制转换为2对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();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top