我在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
很少有字符不正确,即" /"和" ="最后,有人可以帮助我。
答案 0 :(得分:0)
您需要使用的编码是Base64编码的变体,名为base64url。
来自维基百科:
在网址中使用标准Base64需要编码'+','/'和'=' 字符转换为特殊的百分比编码十六进制序列('+' 变为'%2B','/'变为'%2F'而'='变为'%3D'),这使得 字符串不必要地长了。
出于这个原因,存在针对URL变体的修改后的Base64,其中'+' 标准Base64的'/'字符分别用' - '代替 和'_',因此不再需要使用URL编码器/解码器 并且对编码值的长度没有影响,留下 完整的相同编码形式,用于关系数据库,网络表格, 和一般的对象标识符。一些变体允许或要求 省略填充'='符号以避免它们与字段混淆 分隔符,或要求任何此类填充进行百分比编码。一些 库将'='编码为'。'。