Android Sha224とPython Sha224の違い

android hash python sha2
Android Sha224とPython Sha224の違い

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

作成されるものは次のようになり、2つのハッシュを直接下に投稿します。 (最初のものはpython、2番目はandroid)

90a3ed9e32b2aaf4c61c410eb925426119e1a9dc53d4286ade99a809 90a3ed9e32b2aaf4c61c41eb925426119e1a9dc53d4286ade99a89

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

  3  5


ベストアンサー

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

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

4


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

0


一度に2つずつ、16進数を文字列に変換しています。 droppedである最初のゼロは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();

0


タイトルとURLをコピーしました