javascript - 从 computeDigest(algorithm, value) byte[] 取回字符串表示

标签 javascript google-apps-script md5 digest

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;
}

但它在日志中放入了“”

最佳答案

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

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

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

How to convert decimal to hex in JavaScript?给我们这个来检索十六进制字符:

hexString = yourNumber.toString(16);

将它们放在一起,这是您的 sign() 函数,它也是 available as a 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

让我们看看我们从 this on-line MD5 Hash Generator 得到了什么:

081ed57c9b72db0a4ef39a3341e8ad51

我用其他几个字符串尝试过,它们始终与在线生成器的结果匹配。

关于javascript - 从 computeDigest(algorithm, value) byte[] 取回字符串表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16216868/

相关文章:

javascript - 在水平滚动时动态更新 Metro listView (JS/HTML)

google-apps-script - 如何从另一个项目运行谷歌应用脚​​本功能

linux - diff 文件只比较每行的前 n 个字符

java - java .class 文件在不同编译器、版本、依赖项之间的差异是什么?

javascript - 使用变量和循环创建 "onclick"函数

javascript onChange 事件监听器不适用于输入表单

javascript - 让按钮在网站上显示和隐藏导航?

google-apps-script - 通过 Google App 脚本将 CSV/Excel 文件上传为工作表

google-apps-script - 如何获取值在范围内的第一行

php - VB.net + mySQL + md5 哈希建议