Вернуть строковое представление из байта computeDigest (алгоритм, значение) []

Функция 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;
}

но он помещает "" в Журналы

Ответ 1

Если мы поместим Logger.log(signature); сразу после вызова computeDigest(), получим:

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

Как представлено в javascript, дайджест включает как положительные, так и отрицательные целые числа, поэтому мы не можем просто рассматривать их как символы ascii. Однако алгоритм MD5 должен предоставить нам 8-битные значения в диапазоне от 0x00 до 0xFF (255). Таким образом, эти отрицательные значения являются просто неверным истолкованием бит высокого порядка; взяв его за знак. Чтобы исправить, нам нужно добавить 256 к любому отрицательному значению.

Как преобразовать десятичное значение в hex в JavaScript? дает нам это для извлечения шестнадцатеричных символов:

hexString = yourNumber.toString(16);

Объединяя это, здесь ваша функция sign(), которая также является доступной как сущность:

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

Я попробовал это с несколькими другими строками, и они последовательно сопоставляли результат с онлайновым генератором.

Ответ 2

На всякий случай это полезно для всех остальных, я собрал более сжатую версию решения 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;
  },'');
}

Ответ 3

Однострочник:

Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "teststring")
  .map(function(b) {return ("0" + (b < 0 && b + 256 || b).toString(16)).substr(-2)})
  .join("")

Ответ 4

Кто-то сказал кратко? (/Fulldecent прибывает на вечеринку с питьевой шляпой, включая соломинки, после того, как все остальные уже потеряли сознание)

Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "thisisteststring")
  .map(function(chr){return (chr+256).toString(16).slice(-2)})
  .join('')

Ответ 5

Вот простой способ преобразовать Byte [] в String.

Нашел это в документации, предоставленной Google здесь: https://developers.google.com/apps-script/reference/utilities/utilities#base64Decode(String)

Utilities.newBlob(myByteArray).getDataAsString();

Лучше поздно, чем никогда. (И поскольку эта тема по-прежнему стоит на первом месте при поиске этой темы в Goole, это может помочь некоторым людям).

Ответ 6

Из этого сообщения :

function string2Bin(str) {
  var result = [];
  for (var i = 0; i < str.length; i++) {
    result.push(str.charCodeAt(i).toString(2));
  }
  return result;
}