原始 sha256 加密 javascript

sha256 encryption in raw javascript

我正在尝试使用 web-hosted library 在原始 javascript 中将字符串加密为 HMAC SHA256,但它似乎不起作用。 我正在尝试这样做来调用 Coinbase API。您需要为 GET 请求提供一些值,包括签名,这是我遇到问题的地方。签名需要经过 HMAC SHA256 加密。签名应包括以下内容:

The CB-ACCESS-SIGN header is generated by creating a sha256 HMAC using the secret key on the prehash string timestamp + method + requestPath + body (where + represents string concatenation). The timestamp value is the same as the CB-ACCESS-TIMESTAMP header.

The body is the request body string or omitted if there is no request body (typically for GET requests).

The method should be UPPER CASE.

我认为他们的意思是我可以省略正文,因为它是 GET 请求。

我的代码如下:

HTML 库调用:

<script src="https://cdnjs.cloudflare.com/ajax/libs/js-sha256/0.9.0/sha256.js"></script>

Javascript加密和GET请求:

url = "https://api.coinbase.com/v2/accounts"
var xmlHttp1 = new XMLHttpRequest();
xmlHttp1.open( "GET", "https://api.coinbase.com/v2/time", false);
xmlHttp1.send( null )
ts = xmlHttp1.responseText;
var ts1 = JSON.parse(ts)
var message = ts1.data.epoch + "GET" + url + ""
sha256(message);
var hash = sha256.hmac.create('key');

var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", url, false ); // false for synchronous request
xmlHttp.setRequestHeader("CB-ACCESS-KEY", "XXXXXXXXXXXXXXXX");
xmlHttp.setRequestHeader("CB-ACCESS-TIMESTAMP", ts1.data.epoch);
xmlHttp.setRequestHeader("CB-ACCESS-SIGN", hash);
xmlHttp.send( null );

coinbase API 正在响应:

{"errors":[{"id":"authentication_error","message":"invalid signature"}]}

意思是除了签名之外,一切都是正确的。

我自己解决了(云海也看到了其中的一个问题)。

问题是:

  • HMAC 加密需要我的 API_SECRET

  • 我需要使用 URL 参数,而不是整个 URL。