Получить строковое представление из computeDigest(алгоритм, значение) byte[]
Функция скрипта 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;
}
но это ставит "" в журналах
5 ответов
Если мы положим 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 к любому отрицательному значению.
Как преобразовать десятичное в шестнадцатеричное в 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:
Я попробовал это с несколькими другими строками, и они последовательно соответствовали результату от генератора онлайн.
На всякий случай, если это кому-нибудь пригодится, я собрал более краткую версию решения 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;
},'');
}
Один лайнер:
Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "teststring")
.map(function(b) {return ("0" + (b < 0 && b + 256 || b).toString(16)).substr(-2)})
.join("")
Кто-то сказал кратко? (/ Fulldecent прибывает на вечеринку с питьевой шляпой, включая соломинки, после того, как все остальные уже потеряли сознание)
Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "thisisteststring")
.map(function(chr){return (chr+256).toString(16).slice(-2)})
.join('')
Вот простой способ преобразовать Byte[] в String.
Нашел это в документации, предоставленной Google здесь: https://developers.google.com/apps-script/reference/utilities/utilities
Utilities.newBlob(myByteArray).getDataAsString();
Лучше поздно, чем никогда. (И поскольку эта тема по-прежнему стоит на первом месте при поиске по этой теме в Goole, некоторым это может помочь).
Из этого поста:
function string2Bin(str) {
var result = [];
for (var i = 0; i < str.length; i++) {
result.push(str.charCodeAt(i).toString(2));
}
return result;
}