Android的sha224与Python的sha224的区别

3 投票
3 回答
746 浏览
提问于 2025-04-16 07:05

我正在为一个应用原型创建一个简单的用户登录功能。用户的密码会用sha224这种方式进行加密,然后传送到后端。现在我遇到的问题是,存储在数据库中的密码(也是用sha224加密的)看起来和我发送的加密结果有点不同。我用以下代码来生成这些加密结果。

假设密码是 == test

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生成的,第二个是安卓生成的。

90a3ed9e32b2aaf4c61c410eb925426119e1a9dc53d4286ade99a809
90a3ed9e32b2aaf4c61c41eb925426119e1a9dc53d4286ade99a89

它们几乎是一样的,但Python的加密结果多了两个0。你们知道这是为什么吗?

3 个回答

0

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如,有人可能在使用一个叫做“库”的东西时,发现它的某些功能不太好用,或者出现了错误。这种情况很常见,尤其是对于刚开始学习编程的小伙伴们来说。

通常,解决这些问题的方法有很多。首先,可以查看这个库的文档,文档就像是使用说明书,里面会告诉你如何正确使用这个库的功能。如果文档没有解决你的问题,可以试着在网上搜索一下,看看其他人有没有遇到类似的问题,或者在一些编程社区(比如StackOverflow)提问。

另外,有时候更新这个库到最新版本也能解决问题,因为开发者会不断修复错误和改进功能。所以,保持你的工具和库是最新的,能帮助你避免一些常见的问题。

总之,遇到问题时,不要着急,先查资料,看看有没有解决办法,或者向别人请教。编程的学习过程就是不断解决问题的过程,慢慢来,你会越来越熟练的。

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

你正在把十六进制数每两位一组地转换成字符串。第一个被“丢掉”的零出现在第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();
4

你在Android上处理十六进制值的时候格式不对,前面的0被去掉了。

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

撰写回答