0

BlackBerryアプリケーションでは、パスワードからハッシュを取得するために次のコードを使用しています。

        SHA256Digest sha256d = new SHA256Digest();
        byte[] passwordData = null;

        try {
            passwordData = password.getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        DigestOutputStream outputStream = new DigestOutputStream(sha256d, null);
        try {
            outputStream.write(passwordData);
        } catch (IOException e) {
            e.printStackTrace();
        }

        byte[] hashedValue = sha256d.getDigest();
        tempSHA256Password = new String(hashedValue);
        System.out.println(tempSHA256Password);

このコードブロックの最後では、tempSHA256Passwordは次のようになりますëÇ#ÎiGê8óq =ßÝ÷<rê¨_FR»ã。...だから、私が期待していることは決してありません。私は次のような文字列を期待しています:ebc723ce6947ea38f371a03d0cdfddf73c840f7215eaa85f031446529bbb16e3

私は何が間違っているのですか?

4

4 に答える 4

6

tempSHA256Password = new String(hashedValue); このコードを試してみてください:

StringBuffer buffer = new StringBuffer();
for(byte b : hashedValue)
{
    buffer.append(String.format("%02x",b<0 ? b+256 : b));
}
tempSHA256Password = buffer.toString();
于 2012-04-11T09:41:49.237 に答える
4

これが問題です:

tempSHA256Password = new String(hashedValue);

これは、プラットフォームのデフォルトエンコーディングを使用したテキストエンコーディングであるかのように、任意のバイナリデータから文字列を作成しようとします。代わりにヘックスを探しているようです。Javaにはさまざまな16進エンコーディングユーティリティライブラリがたくさんあります。たとえば、ApacheCommonsCodecを調べてみてください。

于 2012-04-11T09:38:44.750 に答える
3

バイナリ値を直接印刷することはできません。

tempSHA256Password = new String(hashedValue);
System.out.println(tempSHA256Password);

したがって、16進数に変換する場合は、次の方法を使用できます。

static final String HEXES = "0123456789ABCDEF";
public static String getHex( byte [] raw ) {
  if ( raw == null ) {
    return null;
  }
  final StringBuffer hex = new StringBuffer( 2 * raw.length );
  for ( final byte b : raw ) {
    hex.append(HEXES.charAt((b & 0xF0) >> 4))
     .append(HEXES.charAt((b & 0x0F)));
  }
  return hex.toString();
}

この方法はここから始まります。興味があれば他の例もあります。

于 2012-04-11T09:40:39.693 に答える
1

表示されるのは、バイナリ形式のハッシュです。あなたはそれを16進数に変換しなければなりません。

于 2012-04-11T09:38:31.303 に答える