3

アプリケーションのプロトタイプとして、単純なユーザー ログインを作成しています。ユーザーのパスワードは、sha224 を使用してハッシュされ、バックエンドに転送されます。私が今直面している問題は次のとおりです。DB に格納されたパスワード (これも 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();

生成されるものは次のようになります。2 つのハッシュを互いの真下に投稿します。(1 番目は python、2 番目は android)

90a3ed9e32b2aaf4c61c410eb925426119e1a9dc53d4286ade99a809 90a3ed9e32b2aaf4c61c41eb925426119e1a9dc53d4286ade99a89

それらはほとんど同じですが、python ハッシュにはさらに 2 つの 0 があります。理由はわかりますか?

4

3 に答える 3

4

Android で 16 進値を適切にフォーマットしていません。先頭の 0 が削除されています。

buffer.append(String.format("%02x", 0xFF & digest[i]));
于 2010-11-15T13:28:21.703 に答える
0

一度に2つのペアで16進数を文字列に変換しています。ドロップされる最初のゼロは23 番目、つまり奇数の位置です。これは先行ゼロです。必要に応じて、変換された 16 進数をゼロで埋める必要があります。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();
于 2010-11-15T13:40:13.020 に答える
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();
于 2010-11-15T13:35:52.193 に答える