sha256 encryption in raw javascript
我正在尝试使用网络托管库在原始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 stringtimestamp + method + requestPath + body (where + represents string concatenation). The timestamp value is the same as theCB-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库调用:
1 | <script src="https://cdnjs.cloudflare.com/ajax/libs/js-sha256/0.9.0/sha256.js"> |
Javascript加密和GET请求:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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响应:
1 | {"errors":[{"id":"authentication_error","message":"invalid signature"}]} |
表示除签名外,其他所有内容都是正确的。
谢谢。
我自己就能弄清楚(云海也看到了其中一个问题)。
问题是:
-
HMAC加密需要我的API_SECRET
-
我需要使用URL参数,而不是整个URL。