javascript如何构建签名?

问题描述 投票:0回答:2

我有这个伪代码,我想将其转换为工作代码:

string constructSignature(string timestamp, string UID, string secretKey) {  
  baseString = timestamp + "_" + UID;                                  // Construct a "base string" for signing  
  binaryBaseString = ConvertUTF8ToBytes(baseString);    // Convert the base string into a binary array  
  binaryKey = ConvertFromBase64ToBytes(secretKey);     // Convert secretKey from BASE64 to a binary array  
  binarySignature = hmacsha1(binaryKey, baseString);      // Use the HMAC-SHA1 algorithm to calculate the signature  
  signature = ConvertToBase64(binarySignature);              // Convert the signature to a BASE64  
  return signature;  
} 

任何的想法?谢谢

javascript signature
2个回答
1
投票

一些想法:

  • 不要计算BinaryBaseString,因为你从不使用它
  • 不要毫无理由地引用UTF8 - JavaScript中的字符串是Unicode,它只是远程连接到UTF。
  • 不要在你的伪代码中加入实现细节 - 特别是那些你实际上并不需要的东西(比如假设密钥应该是“字节”,无论这意味着什么,实际上,standard library接受并返回字符串)。
  • 不要写评论只是重述代码正在做什么。

这让我们:

var constructSignature = function(timestamp, UID, secretKey) {  
  return Crypto.HMAC(Crypto.SHA1, timestamp + "_" + UID, secretKey,
                     { asString: true }); 
};

0
投票

以下是代码的完整实现:

let atob = function(a){
    return new Buffer(a, 'base64').toString('binary');
} 

function ConvertUTF8ToBytes(str) {
    var utf8 = unescape(encodeURIComponent(str));
    var arr = [];
    for (var i = 0; i < utf8.length; i++) {
        arr.push(utf8.charCodeAt(i));
    }
    return new Uint8Array(arr);
}

let ConvertFromBase64ToBytes = function (b64Data){
    var byteCharacters = atob(b64Data);
    var byteNumbers = new Array(byteCharacters.length);
    for (var i = 0; i < byteCharacters.length; i++) {
        byteNumbers[i] = byteCharacters.charCodeAt(i);
    }
    return new Uint8Array(byteNumbers);
}

let constructSignature = function(timestamp, UID, secretKey) {  
    let baseString = timestamp + "_" + UID;
    let binaryBaseString = ConvertUTF8ToBytes(baseString)
    let binaryKey = ConvertFromBase64ToBytes(secretKey)
    let binarySignature = Crypto.createHmac('sha1', binaryKey)
      .update( binaryBaseString )
      .digest('base64');
    return binarySignature;            
};
© www.soinside.com 2019 - 2024. All rights reserved.