3

次のように、PHP で SHA1 ハッシュを生成するサンプル アプリケーションがあります。

base64_encode(pack('H*', sha1($pass)));

Javaで同じことを達成しようとしましたが、これまでのところ、出力は異なります。私が使用したアプローチは次のとおりです (Base64 および Hex クラスは commons-codec ライブラリから取得されます)。

    byte[] rawSHA = null;
    byte[] base64HexSHA = null;
    String hex = null;
    MessageDigest md= null;

    // Get Message Digest Instance.
    try {
        md = MessageDigest.getInstance(SHA1_ALGORITHM);
    } catch (NoSuchAlgorithmException e) {
        LOG.error("Unable to load SHA-1 Message Digest : " + e.getMessage(), e);
        throw new IllegalStateException("SHA-1 Message Digest Instance Not Found");
    }

    // Build SHA1 Hash
    rawSHA = md.digest(rawText.getBytes("UTF-8"));

    // Convert to HEX
    hex = new String(Hex.encodeHex(rawSHA));

    // Encode to Base 64
    base64HexSHA = Base64.encodeBase64(hex.getBytes("UTF-8"));

    // Return String
    return new String(base64HexSHA);

私の質問は、私が取ったアプローチは、PHP の pack() 関数と同じ出力をもたらすでしょうか? 私の推測では、PHP の pack() 関数は raw バイトを返し、Hex.encodeHex は 16 進文字列形式を返します (参照: http://www.w3schools.com/php/func_misc_pack.asp )。

Java で PHP の pack() 関数と同じ出力 (または上記の PHP コードの完全な出力) を得るにはどうすればよいですか?

4

1 に答える 1

3

HEXへの変換は必要ありません。これを使用してください:

base64HexSHA = Base64.encodeBase64(rawSHA);
于 2011-06-23T19:14:05.100 に答える