2017-12-06 16 views
-1

Androidアプリ(API 23)でハッシュ値を生成しようとしています。私はこのリンクに続きました。https://developer.android.com/reference/javax/crypto/Mac.htmlとそれ以下のコードはそれに従って動作するはずです。Android APIのHmacSHA256アルゴリズム

Mac hmacSha256 = Mac.getInstance("HmacSHA1"); 

しかし、これは私が検索し、他のStackOverflowの記事全体からいくつかのソリューションを試みたが、彼らはdidnの時間エラー -

enter image description here

java.security.NoSuchAlgorithmException

をコンパイルできます仕事はありません。

試してみました - MessageDigest digest = MessageDigest.getInstance("SHA-256");同じエラーが発生しました。

私の全体的な意図は、私は私のAndroidの中でそれを使用することができますJavaでC#コードの下に変換することですので、私はちょうどつもりですし、ステップバイステップで、これで立ち往生手動で各ラインを変換

string GenerateAuthToken(string verb, string resourceType, string resourceId, string date, string key, string keyType, string tokenVersion) 
{ 
    var hmacSha256 = new System.Security.Cryptography.HMACSHA256 { Key = Convert.FromBase64String(key) }; 

    verb = verb ?? ""; 
    resourceType = resourceType ?? ""; 
    resourceId = resourceId ?? ""; 

    string payLoad = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}\n{1}\n{2}\n{3}\n{4}\n", 
      verb.ToLowerInvariant(), 
      resourceType.ToLowerInvariant(), 
      resourceId, 
      date.ToLowerInvariant(), 
      "" 
    ); 

    byte[] hashPayLoad = hmacSha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(payLoad)); 
    string signature = Convert.ToBase64String(hashPayLoad); 

    return System.Web.HttpUtility.UrlEncode(String.Format(System.Globalization.CultureInfo.InvariantCulture, "type={0}&ver={1}&sig={2}", 
     keyType, 
     tokenVersion, 
     signature)); 
} 

をAPP-ポイント。私はこの作品を作ることができるすべてのアイデア?

+0

'MessageDigest.getInstance( "SHA-256")であるべきだろう'正常に動作し、参照します。https:// githubの.com/commonsguy/cwac-security/blob/v0.8.0/security/src/main/java/com/commonsware/cwac/security/SignatureUtils.java#L41-L46 – CommonsWare

+0

@CommonsWareそれを試しましたが、同じ例外があります –

+1

例外を示す完全なJavaスタックトレースと、例外をトリガーするコードを入力してください。 – CommonsWare

答えて

0

あなたはそれが彼らが大文字と小文字を区別しているので、あなたは、アルゴリズムを選択する際に注意する必要がありますHMACSHA256

HMACSHA256はありません 誤ったアルゴリズムを入力しました。

あなたのスナップショットから、私はあなたが

Mac hmacSHA256 = Mac.getInstance("hmacSHA256"); 

を使用しますが、HMACSHA256魔女のインスタンスが存在しない取得しようとしているので、それが間違っだと見ることができます!

正しいものは

Mac hmacSHA256 = Mac.getInstance("HmacSHA245"); 

最初Hはキャップ

+0

私はすでにそれを試みました。私が添付したスナップショットを見てください。 –

+1

あなたが添付したスナップショットに 'Mac hmacSHA256 = Mac.getInstance(" hmacSHA256 ");'魔女は間違っている 'Mac hmacSHA256 = Mac.getInstance(" HmacSHA256 ");' –

+0

大文字と小文字は区別されません。 "HmacSHA245"のようなものはありません。 –