java - 使用 Hmac SHA1 签署 HTTP 请求

标签 java javascript hmacsha1

我的 REST API 的授权架构包含如下 HTTP header :

"Authorization: MyAuth: JWT_VALUE:207112ade53c795df43ce38e5251b41ded1791aa"

JWT_VALUE 是标准 Json Web token ,还包含加密的 API key 作为自定义声明。冒号后的第二部分是客户端生成的签名,如下所示:

<script src='lib/hmac-sha1.js' type='text/javascript'></script>

...

var token = ...
var signature = CryptoJS.HmacSHA1(token + httpMethod + requestUrl + requestBody), apiKey);
headers["Authorization"] = "MyAuth " + token + ":" + signature;

问题是我无法在服务器上生成相同的签名;这是我的 Scala 代码:

import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import org.apache.commons.codec.binary.Base64

...

val data = token + request.method + request.uri + request.body.asInstanceOf[AnyContent].asJson.getOrElse("")
val secret = ... // extract api key from token and decrypt it with app secret key

val singed = sign(data, secret)

if (signed != request.signature) {
  // error
  ...
}

...

def sign(data: String, secret: String): String = {
  val mac = Mac.getInstance("HmacSHA1")
  mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA1"))
  Base64.encodeBase64String(mac.doFinal(data))
}

以下是我在调试 session 中得到的示例:

Incoming request signed by the server =========> um/TemuwSzboWD1D4kLRnFD6Sxk=
Signature generated by the client =============> 1c0567113a6bcc9f3715b83182d62e11aff52cec

如您所见,服务器使用 javax.crypto.Mac 生成的签名比客户端使用 CryptoJs 生成的签名短。

最佳答案

正如 Pavel 所说,问题是我在客户端上使用了十六进制表示,在服务器上使用了 BASE64 表示。为了解决这个问题,我只是修改了客户端,如下所示:

<script src='lib/hmac-sha1.js' type='text/javascript'></script>
<script src='lib/enc-base64-min.js' type='text/javascript'></script>

...

var token = ...
var signature = CryptoJS.HmacSHA1(token + httpMethod + requestUrl + requestBody), apiKey).toString(CryptoJS.enc.Base64);
headers["Authorization"] = "MyAuth " + token + ":" + signature;

;

非常感谢帕维尔。

关于java - 使用 Hmac SHA1 签署 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25591963/

相关文章:

java - 如何从通用类创建 BeanPropertyRowMapper?

java - 重复该程序直到用户选择退出

java - 断言某些参数化 vector 会在 JUnit 中抛出异常?

javascript - 使用 jquery 从 html 表生成 excel 表

javascript - jQuery 单击事件显示 JSON 数组中的特定数据无法正常工作

ios - 使用 HMAC-SHA1 签署 oAuth 请求

delphi - OAuth 1.0 生成签名与 Postman 生成签名

java - JDK 7 中的链接#registerBootstrapMethod

javascript - 如何调试由 Chutzpah/PhantomJS 执行的 JavaScript

Java 代码到 ruby