Разница между Android Sha224 и Python Sha224 - PullRequest
3 голосов
/ 15 ноября 2010

Для прототипа приложения я создаю простой логин пользователя. После этого пароль пользователя будет хеширован с помощью sha224 и передан на сервер. Проблема, с которой я сталкиваюсь сейчас, заключается в следующем. Пароль, который был сохранен в БД (также хэшированный с помощью sha224), выглядит немного иначе, чем хеш, который я посылаю. Я использую следующий код для создания хэшей.

данный пароль == тест

Python

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

Android

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

То, что сейчас будет создано, выглядит следующим образом, и я выложу два хеша непосредственно друг под другом. (Первый это питон а второй андроид)

90a3ed9e32b2aaf4c61c410eb925426119e1a9dc53d4286ade99a809 90a3ed9e32b2aaf4c61c41eb925426119e1a9dc53d4286ade99a89

Они почти одинаковы, но хэш питона имеет еще два 0. Ребята, вы понимаете, почему?

Ответы [ 3 ]

4 голосов
/ 15 ноября 2010

Вы неправильно форматируете шестнадцатеричные значения на Android;ведущие 0 отбрасываются.

buffer.append(String.format("%02x", 0xFF & digest[i]));
0 голосов
/ 15 ноября 2010

Вы конвертируете гекс в строку парами по 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();
0 голосов
/ 15 ноября 2010
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();
...