HMAC-SHA256 - 怎么样?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HMAC-SHA256 - 怎么样?相关的知识,希望对你有一定的参考价值。

我在android中做HMAC-SHA256。这是以下代码:

String baseString = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI2NjU0MjA5MGE2NGJhYWU0MzI4NGFiYTY0MmNkNWJmNmFlNzdkNjFhIiwiYXVkIjoiaHR0cHM6Ly9hcHAuaWZvcm1idWlsZGVyLmNvbS9leHphY3QvYXBpL29hdXRoL3Rva2VuIiwiZXhwIjoxNTEwNDMyMzcyLCJpYXQiOjE1MTA0MzE3NzJ9";

String clientSecret = "167edb4d9c3e603131619ae4a92c76307e3f9631";
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new 
SecretKeySpec(clientSecret.getBytes("UTF-8"), "HmacSHA256");
sha256_HMAC.init(secret_key);
String jwtSignature = 
Base64.encodeToString(sha256_HMAC.doFinal(baseString.getBytes("UTF-8")), Base64.NO_WRAP);
Log.d("JWT-SIGNATURE", jwtSignature);

我得到JWT-SIGNATURE值为2nFaU / 7jcc99jTWCO0VLriN / fiLwqi / ap7eeuVhhal4 =

相反,正确的JWT-SIGNATURE值应为2nFaU_7jcc99jTWCO0VLriN_fiLwqi_ap7eeuVhhal4

很少有字符不正确,即“/”和最后的“=”。有人可以帮助我。

答案

您需要使用的编码是Base64编码的变体,称为base64url。

来自维基百科:

在URL中使用标准Base64需要将'+','/'和'='字符编码为特殊的百分比编码十六进制序列('+'变为'%2B','/'变为'%2F'并且'='变为'%3D'),这使得字符串不必要地更长。

出于这个原因,存在针对URL变体的修改后的Base64,其中标准Base64的'+'和'/'字符分别被' - '和'_'替换,因此不再需要使用URL编码器/解码器而且没有对编码值的长度的影响,保留相同的编码形式,以便在关系数据库,Web表单和对象标识符中使用。某些变体允许或要求省略填充'='符号以避免它们与字段分隔符混淆,或要求任何此类填充都是百分比编码。有些库会将'='编码为'。'。

以上是关于HMAC-SHA256 - 怎么样?的主要内容,如果未能解决你的问题,请参考以下文章

对于 PBKDF2,使用 HMAC-SHA256 是不是比使用 HMAC-SHA-1 更安全?

使用 HMAC-SHA256 的 Python 编码消息

php PHP和ASP.NET HMAC-SHA256签名

对接微信支付使用HMAC-SHA256使用签名算法实现方式

SHA256

接微信支付提示:支付验证签名失败