【发布时间】:2017-12-07 01:34:12
【问题描述】:
我正在尝试在我的 Android 应用程序 (API 23) 中生成哈希值。我点击了这个链接-https://developer.android.com/reference/javax/crypto/Mac.html,下面的代码应该可以正常工作。
Mac hmacSha256 = Mac.getInstance("HmacSHA1");
但这会产生编译时错误-
java.security.NoSuchAlgorithmException
我从其他 Stackoverflow 帖子中搜索并尝试了一些解决方案,但没有奏效。
试过了-MessageDigest digest = MessageDigest.getInstance("SHA-256"); 得到了同样的错误。
我的总体意图是将以下 C# 代码转换为 Java,以便我可以在我的 Android 应用程序中使用它-
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));
}
所以我只是一步一步地手动转换每一行并停留在这一点上。我有什么想法可以完成这项工作吗?
【问题讨论】:
-
MessageDigest.getInstance("SHA-256")工作正常,请参阅:github.com/commonsguy/cwac-security/blob/v0.8.0/security/src/… -
@CommonsWare 我试过了,但它给出了同样的异常
-
请提供完整的 Java 堆栈跟踪,显示异常和触发异常的代码。
-
我看不出有什么例外。