android sha224和python sha224之间的区别

对于应用程序原型,我正在创建一个简单的用户登录。然后使用sha224对用户的密码进行散列并传输到后端。我现在面临的问题如下。存储在数据库中的密码(也使用sha224进行散列)看起来与我发送的散列略有不同。我使用以下代码来创建哈希。 给定密码==测试 蟒蛇
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。你们有什么想法吗?     
已邀请:
您没有正确格式化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个字符串。丢弃的第一个零是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();
    

要回复问题请先登录注册