13

Google App Script 関数の 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);の呼び出しの直後に置くと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で10進数を16進数に変換するには? 16進文字を取得するためにこれを提供します:

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 Hash Generatorから得られるものを見てみましょう:

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 に答える
-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 に答える