13

Google App 脚本函数 computeDigest 返回签名的字节数组。如何获得摘要的字符串表示形式?

我已经尝试过 bin2String() 函数。

function sign(){     
var signature = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "thisisteststring")
Logger.log(bin2String(signature));
}


function bin2String(array) {
  var result = "";
  for (var i = 0; i < array.length; i++) {
    result += String.fromCharCode(parseInt(array[i], 2));
  }
  return result;
}

但它把“”放在日志中

4

6 回答 6

27

如果我们Logger.log(signature);在调用 to 之后立即放置computeDigest(),我们会得到:

[8, 30, -43, 124, -101, 114, -37, 10, 78, -13, -102, 51, 65, -24, -83, 81]

正如 javascript 中所表示的,摘要包括正整数和负整数,因此我们不能简单地将它们视为 ascii 字符。然而,MD5 算法应该为我们提供 0x00 到 0xFF (255) 范围内的 8 位值。那么,那些负值只是对高位的误解。把它当作一个标志位。为了更正,我们需要在任何负值上加上 256。

如何在 JavaScript 中将十进制转换为十六进制?给我们这个来检索十六进制字符:

hexString = yourNumber.toString(16);

综上所述,sign()这是您的功能,也可作为 gist 使用

function sign(message){     
  message = message || "thisisteststring";
  var signature = Utilities.computeDigest(
                       Utilities.DigestAlgorithm.MD5,
                       message,
                       Utilities.Charset.US_ASCII);
  Logger.log(signature);
  var signatureStr = '';
    for (i = 0; i < signature.length; i++) {
      var byte = signature[i];
      if (byte < 0)
        byte += 256;
      var byteStr = byte.toString(16);
      // Ensure we have 2 chars in our byte, pad with 0
      if (byteStr.length == 1) byteStr = '0'+byteStr;
      signatureStr += byteStr;
    }   
  Logger.log(signatureStr);
  return signatureStr;
}

以下是日志包含的内容:

[13-04-25 21:46:55:787 EDT] [8, 30, -43, 124, -101, 114, -37, 10, 78, -13, -102, 51, 65, -24, -83, 81]
[13-04-25 21:46:55:788 EDT] 081ed57c9b72db0a4ef39a3341e8ad51

让我们看看我们从这个在线 MD5 哈希生成器中得到了什么:

081ed57c9b72db0a4ef39a3341e8ad51

我尝试了其他一些字符串,它们始终与在线生成器的结果相匹配。

于 2013-04-26T01:51:09.363 回答
17

以防万一这对其他人有帮助,我整理了 Mogsdad 解决方案的更简洁版本:

function md5(str) {
  return Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, str).reduce(function(str,chr){
    chr = (chr < 0 ? chr + 256 : chr).toString(16);
    return str + (chr.length==1?'0':'') + chr;
  },'');
}
于 2015-01-13T23:33:33.637 回答
7

单线:

Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "teststring")
  .map(function(b) {return ("0" + (b < 0 && b + 256 || b).toString(16)).substr(-2)})
  .join("")
于 2015-12-05T21:43:01.490 回答
5

有人说简洁吗?(/fulldecent 在其他人都已经昏倒之后,带着酒帽,包括吸管来到派对上

Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "thisisteststring")
  .map(function(chr){return (chr+256).toString(16).slice(-2)})
  .join('')
于 2018-04-10T17:09:09.470 回答
2

这是将 Byte[] 转换为 String 的简单方法。

在谷歌提供的文档中找到了这个:https://developers.google.com/apps-script/reference/utilities/utilities#base64Decode(String)

Utilities.newBlob(myByteArray).getDataAsString();

迟到总比不到好。(并且由于在 Goole 中搜索该主题时,该主题仍然排在首位,这可能对某些人有所帮助)。

于 2019-06-18T23:19:19.287 回答
-1

从这篇文章

function string2Bin(str) {
  var result = [];
  for (var i = 0; i < str.length; i++) {
    result.push(str.charCodeAt(i).toString(2));
  }
  return result;
}
于 2013-04-25T14:06:48.480 回答