Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android API 23中的HmacSHA256算法_Java_C#_Android_Sha256 - Fatal编程技术网

Java Android API 23中的HmacSHA256算法

Java Android API 23中的HmacSHA256算法,java,c#,android,sha256,Java,C#,Android,Sha256,我正在尝试在我的Android应用程序(API 23)中生成哈希值。我遵循了这个链接-下面的代码应该按照它工作 Mac hmacSha256 = Mac.getInstance("HmacSHA1"); 但这会产生编译时错误- java.security.NoSuchAlgorithmException 我在其他Stackoverflow帖子中搜索并尝试了一些解决方案,但都不起作用 尝试了这个-MessageDigest=MessageDigest.getInstance(“SHA-256”

我正在尝试在我的Android应用程序(API 23)中生成哈希值。我遵循了这个链接-下面的代码应该按照它工作

Mac hmacSha256 = Mac.getInstance("HmacSHA1");
但这会产生编译时错误-

java.security.NoSuchAlgorithmException

我在其他Stackoverflow帖子中搜索并尝试了一些解决方案,但都不起作用

尝试了这个-
MessageDigest=MessageDigest.getInstance(“SHA-256”)得到了相同的错误

我的总体意图是用Java转换下面的C#代码,这样我就可以在我的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));
}

因此,我只是一步一步地手动转换每一行,并停留在这一点上。我有什么办法可以使这项工作顺利进行吗?

您键入的算法不正确 是HmacSHA256不是HmacSHA256

选择算法时需要小心,因为它们区分大小写

从您的快照中,我可以看出您使用了

Mac hmacSHA256 = Mac.getInstance("hmacSHA256");
这是不正确的,因为您试图获取的hmacSHA256 witch实例不存在

正确的答案是

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

第一个H应该在caps上
MessageDigest.getInstance(“SHA-256”)
工作正常,请参阅:@commonware我试过了,但它给出了相同的异常。请提供完整的Java堆栈跟踪,显示异常和触发异常的代码。我没有看到异常。您附加的快照包含
Mac hmacSHA256=Mac.getInstance(“hmacSHA256”)开关错误,应该是
Mac hmacSHA256=Mac.getInstance(“hmacSHA256”)它们不区分大小写。没有“HmacSHA245”这样的东西。@PedroCavaleiro我已经尝试过这些可能的组合。@SouvikGhosh检查这个例子,并仔细检查导入