android sha224和python sha224之间的区别

时间:2010-11-15 13:26:12

标签: android python hash sha2

对于应用程序原型,我正在创建一个简单的用户登录。然后使用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。你们有什么想法吗?

3 个答案:

答案 0 :(得分:4)

您没有正确格式化Android上的十六进制值;领先0正在被淘汰。

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

答案 1 :(得分: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();

答案 2 :(得分:0)

您正在将十六进制转换为一对一对2的字符串。 dropped的第一个零位于第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();