3

エンコーディングを使用してソルトとして12345使用して暗号化しようとしていますが、得られる答えは次のとおりです。これは、このサイト によって返される値と同じではありません。1111SHA-256010def5ed854d162aa19309479f3ca44dc7563232ff072d1c87bd85943d0e930

コード スニペットは次のとおりです。

public String getHashValue(String entity, String salt){
    byte[] hashValue = null;
    try {
        MessageDigest digest =  MessageDigest.getInstance("SHA-256");
        digest.update(entity.getBytes("UTF-8"));
        digest.update(salt.getBytes("UTF-8"));
        hashValue = digest.digest();
    } catch (NoSuchAlgorithmException e) {
        Log.i(TAG, "Exception "+e.getMessage());
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return BasicUtil.byteArrayToHexString(hashValue);
}

SO のサンプルを使用して印刷方法を検証しましたが、結果は問題ありません。誰かがここで何が悪いのか教えてもらえますか?

明確にするために、iOSコードで同じ値とソルトを暗号化すると、返される値は変換サイトから提供された値と同じになります。

4

1 に答える 1

2

そのサイトでhmacシークレットのオプション部分を入力すると、HmacSHA256アルゴリズムが使用されます。この関数でも同じ結果が得られます。

public static String getHmac(String entity, String salt) throws Exception{
    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(new SecretKeySpec(salt.getBytes(), "HmacSHA1"));
    byte[] bs = mac.doFinal(entity.getBytes());
    return new HexDumpEncoder().encode(bs); // use your favorite hex converter
}

そのサイトから同じ出力を取得したい場合は、hmacシークレットなしでこの値「123451111」をハッシュしてみてください。

明らかなように、MessageDigest.updateを2回呼び出すことは、連結された値を使用して1回呼び出すことと同じです。

于 2012-12-01T23:00:08.967 に答える