1

以下のコードと同等の Java コードを作成しています。しかし、encodedStringに対して同じ結果を返すものを作成できます。同じ結果を得るためにどの Java クラスを使用できますか?

//Set the Hash method to SHA1
HMAC hash;
switch (validation)
{
    case MachineKeyValidation.MD5:
        hash = new HMACMD5();
        break;
    case MachineKeyValidation.SHA1:
    default:
        hash = new HMACSHA1();
        break;
}
//Get the hash validation key as an array of bytes
hash.Key = HexToByte(validationKey);
//Encode the password based on the hash key and
//converts the encrypted value into a string
encodedString = Convert.ToBase64String(hash.ComputeHash(Encoding.Unicode.GetBytes(password)));

前もって感謝します!:)

4

2 に答える 2

2

翻訳コードの解決策を見つけました。2つの主な問題がありました。HMACSHA1を要求するとき、私はSHA1アルゴリズムについて話しているのではなく、 HmacSHA1について話している。また、JavaとC#のエンコーディングには違いがあります。正しいキーと正しいアルゴリズムを使用していましたが、エンコーディングが異なりました。

SecretKeySpec signingKey = new SecretKeySpec(key, "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
// The big problem is difference between C# and Java encoding
byte[] rawHmac = mac.doFinal(data.getBytes("UTF-16LE"));
result = new String(Base64.encode(rawHmac));
于 2011-02-16T17:30:04.757 に答える
1

Javaでのハッシュ関数の計算に関するこの質問を参照してください。

そして、 java.security.MessageDigest.getInstance(Stringアルゴリズム)のjavadocを見てください。

追加するために編集:

次のアプリを実行して、登録したプロバイダーを確認してください。


import java.security.Provider;
import java.security.Security;

public class SecurityTest {

    public static void main(String[] args) {

        Provider[] providers = Security.getProviders();
        for (Provider p : providers) {
            System.out.println(p.toString());
        }
    }
}

少なくともいくつかのSunプロバイダーがリストされている必要があります。そうでない場合は、いくつかのセキュリティライブラリをダウンロードする必要があります。

于 2011-02-15T19:04:40.183 に答える