2013-04-25 2 views
9

Функция Google App Script computeDigest возвращает массив байтов подписи. Как я могу получить строковое представление дайджеста?верните представление строки из computeDigest (algorithm, value) byte []

Я уже пробовал функцию 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; 
} 

, но он ставит "" в журналах

+0

вам нужно добавлять, что вы пробовали. – Woot4Moo

ответ

16

Если мы помещаем 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 к любому отрицательному значению.

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

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

+1

капитала. столица. это работает красиво! Благодаря! :) –

-1

Из этого post:

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

ну на самом деле это bin2string. Но я уже пробовал это. и это не сработает. Попробуйте сами. –

+0

@SaqibAli, что с этим не работает? – Woot4Moo

+0

отправил код, который я уже пробовал. –

11

Только в случае, если это полезно кому-либо еще, я собрал более емким вариант решения 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; 
    },''); 
} 
+0

Привет, Майк, я использовал вашу библиотеку «gmail-to-pdf», чтобы создать скрипт. он работает нормально, но у меня есть небольшая проблема в случае, когда у электронной почты уже есть вложение. Не могли бы вы взглянуть на мой вопрос, спасибо: http: // stackoverflow.com/questions/36050099/how-to-check-if-an-email-has-a-pdf-attach-to-it-then-forward-it-to-another-em – AziCode

4

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

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

Можете ли вы объяснить немного больше о том, как это работает? В интересах обучения будущих читателей. –

+0

1) «карта» берет каждый байт в массиве, возвращаемом «computeDigest» и выполняет на нем некоторое преобразование. 2) "(b <0 && b + 256 || b)" - && имеет приоритет над || поэтому он выглядит следующим образом: ((b <0 && b + 256) || b). В нем говорится: «Если b <0, дайте b + 256, иначе дайте b». 3) ".toString (16)" Преобразовать скорректированное значение "b" в шестую строку 4) "0" + шестнадцатеричная строка (в случае, если b меньше 16, например, если b равно 1, то: "0" + «1» -> «01» .Если в случае b равно 16 или больше, мы получим «010». Но мы просто хотим два символа, так что 5) «substr (-2)» взять последние два символа 6) присоединиться – CarelZA

+2

На самом деле вам не нужны условные обозначения: inputArray.map (функция (b) {return ("0" + ((b + 256)% 256) .toString (16)). slice (-2)}) .присоединиться(""); – CarelZA