Woot woot, если у require('crypto').createHash('md5').update(STRING_TO_BE_HASHED).digest("hex")вас есть один вкладыш. Ура, приятель!
Балуптон
3
.updateНесколько раз возникали проблемы с использованием ( github.com/joyent/node/issues/749 ) при попытке использовать timboooрешение, используя однострочное исправление (поскольку хеш-объект воссоздается каждый раз).
Макс
Есть ли способ изменить длину строки? Не только 32 символа, 64 или 128 или другое число.
Микель
@Mikel попробуйте, если есть другие алгоритмы хеширования, которые соответствуют вашим потребностям, md5 всегда 32 символа.
Галстуки
Если у меня много строк для хэширования, менее эффективно продолжать вызывать crypto.createHash вместо повторного использования результата?
Майкл
81
API-интерфейс криптомодуля Node по-прежнему нестабилен.
Начиная с версии 4.0.0, родной модуль Crypto больше не является нестабильным. Из официальной документации :
крипто-
Стабильность: 2 - Стабильный
API оказался удовлетворительным. Совместимость с экосистемой npm является первоочередной задачей и не будет нарушена без крайней необходимости.
Таким образом, следует считать безопасным использование собственной реализации без внешних зависимостей.
Для справки, упомянутые ниже модули были предложены в качестве альтернативных решений, когда модуль Crypto был еще нестабилен.
Вы также можете использовать один из модулей sha1 или md5, которые оба выполняют свою работу.
$ npm install sha1
а потом
var sha1 = require('sha1');var hash = sha1("my message");
console.log(hash);// 104ab42f1193c336aa2cf08a2c946d5c6fd0fcdb
или
$ npm install md5
а потом
var md5 = require('md5');var hash = md5("my message");
console.log(hash);// 8ba6c19dc1def5702ff5acbf2aeea5aa
(MD5 небезопасен, но часто используется такими сервисами, как Gravatar.)
Я думаю, что гораздо проще и эффективнее использовать Crypto, чем вводить совершенно новый модуль.
Вальяс
6
Из текущей документации по Node.js: «Стабильность: 2 - Нестабильно; изменения API обсуждаются в будущих версиях. Изменения будут сведены к минимуму». API моего модуля не изменится. Когда я изначально писал модуль, в платформу не было встроено ни одногоcrypto модуля. Еще одним преимуществом является то, что вы можете использовать мой модуль на сервере, а также на стороне клиента. Но это зависит только от вас, какую библиотеку вы используете.
Пворб
7
Сборка в Crypto хешах давала мне BS с ошибкой обновления хешей. Наконец я перешел на модуль MD5, и он работал просто отлично. Также проще позвонить (слегка). Спасибо.
GJK
2
+1 за опцию, которая остается в стороне от (2) - Нестабильная природа Crypto API!
Geek Stocks
1
Я исправил странную проблему с sha1 на узле 0.11.x на моей машине с Windows, поменяв стандартное шифрование для этого модуля.
Bartvds
24
sha256("string or binary");
У меня возникла проблема с другим ответом. Я советую вам установить аргумент кодированияbinary чтобы использовать байтовую строку и предотвращать различный хеш между Javascript (NodeJS) и другими языками / сервисами, такими как Python, PHP, Github ...
Если вы не используете этот код, вы можете получить другой хеш между NodeJS и Python ...
Как получить тот же хеш, что и Python, PHP, Perl, Github (и предотвратить проблему):
NodeJS хэширует UTF-8 представление строки. Другие языки (например, Python, PHP или PERL ...) хэшируют строку байта.
Мы можем добавить двоичный аргумент для использования байтовой строки.
Код:
const crypto = require("crypto");function sha256(data){return crypto.createHash("sha256").update(data,"binary").digest("base64");// ------ binary: hash the byte string}
sha256("string or binary");
Документация:
crypto.createHash (алгоритм [, параметры]): алгоритм зависит от доступных алгоритмов, поддерживаемых версией OpenSSL на платформе.
hash.digest ([encoding]): кодировка может быть 'hex', 'latin1' или 'base64'. (база 64 менее длинная).
Вы можете получить проблему с: sha256 ("\ xac"), "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ x93" и т. Д ...
Другие языки (например, PHP, Python, Perl ...) и мое решение с .update(data, "binary"):
Здесь вы можете сравнить все поддерживаемые хеши на вашем оборудовании, поддерживаемые вашей версией node.js. Некоторые из них криптографические, а некоторые только для контрольной суммы. Его вычисление «Hello World» 1 миллион раз для каждого алгоритма. Это может занять около 1-15 секунд для каждого алгоритма (протестировано на стандартном Google Computing Engine с Node.js 4.2.2).
Я использую blueimp-md5, который «совместим с серверными средами, такими как Node.js, загрузчиками модулей, такими как RequireJS, Browserify или webpack, и всеми веб-браузерами».
Используйте это так:
var md5 = require("blueimp-md5");var myHashedString = createHash('GreensterRox');
createHash(myString){return md5(myString);}
Если вы передаете хэшированные значения в открытую, всегда полезно посолить их, чтобы людям было труднее их воссоздать:
createHash(myString){var salt ='HnasBzbxH9';return md5(myString+salt);}
function md5(a){var r =0,
c ="";return h(a);function h(t){return u(l(m(t)))}function l(t){return p(g(f(t),8* t.length))}function u(t){for(var e, i = r ?"0123456789ABCDEF":"0123456789abcdef", n ="", o =0; o < t.length; o++)
e = t.charCodeAt(o),
n += i.charAt(e >>>4&15)+ i.charAt(15& e);return n
}function m(t){for(var e, i, n ="", o =-1;++o < t.length;)
e = t.charCodeAt(o),
i = o +1< t.length ? t.charCodeAt(o +1):0,55296<= e && e <=56319&&56320<= i && i <=57343&&(e =65536+((1023& e)<<10)+(1023& i),
o++),
e <=127? n +=String.fromCharCode(e): e <=2047? n +=String.fromCharCode(192| e >>>6&31,128|63& e): e <=65535? n +=String.fromCharCode(224| e >>>12&15,128| e >>>6&63,128|63& e): e <=2097151&&(n +=String.fromCharCode(240| e >>>18&7,128| e >>>12&63,128| e >>>6&63,128|63& e));return n
}function f(t){for(var e =Array(t.length >>2), i =0; i < e.length; i++)
e[i]=0;for(i =0; i <8* t.length; i +=8)
e[i >>5]|=(255& t.charCodeAt(i /8))<< i %32;return e
}function p(t){for(var e ="", i =0; i <32* t.length; i +=8)
e +=String.fromCharCode(t[i >>5]>>> i %32&255);return e
}function g(t, e){
t[e >>5]|=128<< e %32,
t[14+(e +64>>>9<<4)]= e;for(var i =1732584193, n =-271733879, o =-1732584194, s =271733878, a =0; a < t.length; a +=16){var r = i,
c = n,
h = o,
l = s;
n = E(n = E(n = E(n = E(n = N(n = N(n = N(n = N(n = C(n = C(n = C(n = C(n = S(n = S(n = S(n = S(n, o = S(o, s = S(s, i = S(i, n, o, s, t[a +0],7,-680876936), n, o, t[a +1],12,-389564586), i, n, t[a +2],17,606105819), s, i, t[a +3],22,-1044525330), o = S(o, s = S(s, i = S(i, n, o, s, t[a +4],7,-176418897), n, o, t[a +5],12,1200080426), i, n, t[a +6],17,-1473231341), s, i, t[a +7],22,-45705983), o = S(o, s = S(s, i = S(i, n, o, s, t[a +8],7,1770035416), n, o, t[a +9],12,-1958414417), i, n, t[a +10],17,-42063), s, i, t[a +11],22,-1990404162), o = S(o, s = S(s, i = S(i, n, o, s, t[a +12],7,1804603682), n, o, t[a +13],12,-40341101), i, n, t[a +14],17,-1502002290), s, i, t[a +15],22,1236535329), o = C(o, s = C(s, i = C(i, n, o, s, t[a +1],5,-165796510), n, o, t[a +6],9,-1069501632), i, n, t[a +11],14,643717713), s, i, t[a +0],20,-373897302), o = C(o, s = C(s, i = C(i, n, o, s, t[a +5],5,-701558691), n, o, t[a +10],9,38016083), i, n, t[a +15],14,-660478335), s, i, t[a +4],20,-405537848), o = C(o, s = C(s, i = C(i, n, o, s, t[a +9],5,568446438), n, o, t[a +14],9,-1019803690), i, n, t[a +3],14,-187363961), s, i, t[a +8],20,1163531501), o = C(o, s = C(s, i = C(i, n, o, s, t[a +13],5,-1444681467), n, o, t[a +2],9,-51403784), i, n, t[a +7],14,1735328473), s, i, t[a +12],20,-1926607734), o = N(o, s = N(s, i = N(i, n, o, s, t[a +5],4,-378558), n, o, t[a +8],11,-2022574463), i, n, t[a +11],16,1839030562), s, i, t[a +14],23,-35309556), o = N(o, s = N(s, i = N(i, n, o, s, t[a +1],4,-1530992060), n, o, t[a +4],11,1272893353), i, n, t[a +7],16,-155497632), s, i, t[a +10],23,-1094730640), o = N(o, s = N(s, i = N(i, n, o, s, t[a +13],4,681279174), n, o, t[a +0],11,-358537222), i, n, t[a +3],16,-722521979), s, i, t[a +6],23,76029189), o = N(o, s = N(s, i = N(i, n, o, s, t[a +9],4,-640364487), n, o, t[a +12],11,-421815835), i, n, t[a +15],16,530742520), s, i, t[a +2],23,-995338651), o = E(o, s = E(s, i = E(i, n, o, s, t[a +0],6,-198630844), n, o, t[a +7],10,1126891415), i, n, t[a +14],15,-1416354905), s, i, t[a +5],21,-57434055), o = E(o, s = E(s, i = E(i, n, o, s, t[a +12],6,1700485571), n, o, t[a +3],10,-1894986606), i, n, t[a +10],15,-1051523), s, i, t[a +1],21,-2054922799), o = E(o, s = E(s, i = E(i, n, o, s, t[a +8],6,1873313359), n, o, t[a +15],10,-30611744), i, n, t[a +6],15,-1560198380), s, i, t[a +13],21,1309151649), o = E(o, s = E(s, i = E(i, n, o, s, t[a +4],6,-145523070), n, o, t[a +11],10,-1120210379), i, n, t[a +2],15,718787259), s, i, t[a +9],21,-343485551),
i = v(i, r),
n = v(n, c),
o = v(o, h),
s = v(s, l)}return[i, n, o, s]}function _(t, e, i, n, o, s){return v((a = v(v(e, t), v(n, s)))<<(r = o)| a >>>32- r, i);var a, r
}function S(t, e, i, n, o, s, a){return _(e & i |~e & n, t, e, o, s, a)}function C(t, e, i, n, o, s, a){return _(e & n | i &~n, t, e, o, s, a)}function N(t, e, i, n, o, s, a){return _(e ^ i ^ n, t, e, o, s, a)}function E(t, e, i, n, o, s, a){return _(i ^(e |~n), t, e, o, s, a)}function v(t, e){var i =(65535& t)+(65535& e);return(t >>16)+(e >>16)+(i >>16)<<16|65535& i
}}
string ='hello';
console.log(md5(string));
Даже если хеш не для безопасности, вы можете использовать sha вместо md5. На мой взгляд, люди должны забыть о md5 на данный момент, это в прошлом!
Нормальный nodejs sha256 устарел. Итак, у вас есть две альтернативы:
var shajs = require('sha.js')- https://www.npmjs.com/package/sha.js (used by Browserify)var hash = require('hash.js')- https://github.com/indutny/hash.js
Я предпочитаю использовать shajsвместо hash, потому что я считаю sha лучшей хэш-функцией в настоящее время, и вам пока не нужна другая хеш-функция. Таким образом, чтобы получить хеш в шестнадцатеричном виде, вы должны сделать что-то вроде следующего:
Ответы:
Взгляните на crypto.createHash (алгоритм)
источник
Если вы просто хотите, чтобы md5 хешировал простую строку, я нашел, что это работает для меня.
источник
require('crypto').createHash('md5').update(STRING_TO_BE_HASHED).digest("hex")
вас есть один вкладыш. Ура, приятель!.update
Несколько раз возникали проблемы с использованием ( github.com/joyent/node/issues/749 ) при попытке использоватьtimbooo
решение, используя однострочное исправление (поскольку хеш-объект воссоздается каждый раз).API-интерфейс криптомодуля Node по-прежнему нестабилен.Начиная с версии 4.0.0, родной модуль Crypto больше не является нестабильным. Из официальной документации :
Таким образом, следует считать безопасным использование собственной реализации без внешних зависимостей.
Для справки, упомянутые ниже модули были предложены в качестве альтернативных решений, когда модуль Crypto был еще нестабилен.
Вы также можете использовать один из модулей sha1 или md5, которые оба выполняют свою работу.
а потом
или
а потом
(MD5 небезопасен, но часто используется такими сервисами, как Gravatar.)
API этих модулей не изменится!
источник
crypto
модуля. Еще одним преимуществом является то, что вы можете использовать мой модуль на сервере, а также на стороне клиента. Но это зависит только от вас, какую библиотеку вы используете.У меня возникла проблема с другим ответом. Я советую вам установить аргумент кодирования
binary
чтобы использовать байтовую строку и предотвращать различный хеш между Javascript (NodeJS) и другими языками / сервисами, такими как Python, PHP, Github ...Если вы не используете этот код, вы можете получить другой хеш между NodeJS и Python ...
Как получить тот же хеш, что и Python, PHP, Perl, Github (и предотвратить проблему):
Мы можем добавить двоичный аргумент для использования байтовой строки.
Код:
Документация:
Вы можете получить проблему с: sha256 ("\ xac"), "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ x93" и т. Д ...
Другие языки (например, PHP, Python, Perl ...) и мое решение с
.update(data, "binary")
:Nodejs по умолчанию (без двоичного кода):
источник
crypto
Модуль делает это очень легко.Настроить:
Использование:
источник
Здесь вы можете сравнить все поддерживаемые хеши на вашем оборудовании, поддерживаемые вашей версией node.js. Некоторые из них криптографические, а некоторые только для контрольной суммы. Его вычисление «Hello World» 1 миллион раз для каждого алгоритма. Это может занять около 1-15 секунд для каждого алгоритма (протестировано на стандартном Google Computing Engine с Node.js 4.2.2).
Результат:
DSA: 1992 мсек
DSA-SHA: 1960 мсек
DSA-SHA1: 2062 мсек
DSA-SHA1-старое: 2124 мсек
RSA-MD4: 1893 мсек
RSA-MD5: 1982 мсек
RSA-MDC2: 2797 мсек
RSA-RIPEMD160: 2101 мсек
RSA-SHA: 1948 мсек
RSA-SHA1 : 1908ms
RSA-SHA1-2: 2042ms
RSA-SHA224: 2176ms
RSA-SHA256: 2158ms
RSA-SHA384: 2290ms
RSA-SHA512: 2357ms
dsaEncryption: 1936ms
dsaWithSHA: 1910ms
dsaWithSHA1: 1926ms
DSS1: 1928ms
ECDSA-с-SHA1: 1880ms
MD4: 1833ms
md4WithRSAEcryption: 1925ms
md5: 1863ms
md5WithRSAEcryption: 1923ms
mdc2: 2729ms
mdc2WithRSA: 2890 мс
RIPEMD: 2101ms
ripemd160: 2153ms
ripemd160WithRSA: 2210ms
rmd160: 2146ms
Sha: 1929ms
SHA1: 1880ms
sha1WithRSAEncryption: 1957ms
sha224: 2121ms
sha224WithRSAEncryption: 2290ms
sha256: 2134ms
sha256WithRSAEncryption: 2190ms
SHA384: 2181ms
sha384WithRSAEncryption: 2343ms
SHA512: 2371ms
sha512WithRSAEncryption: 2434ms
shaWithRSAEncryption: 1966ms
SSL2-md5: 1853ms
ssl3-md5: 1868 мс
ssl3-sha1: 1971 мс
джакузи: 2578 мс
источник
RSA-
префиксы?Простые вкладыши:
Если вы хотите текстовый хеш UTF8:
Если вы хотите получить тот же хеш с Python, PHP, Perl, Github:
Кроме того, можно заменить
'sha256'
с'sha1'
,'md5'
,'sha256'
,'sha512'
источник
Учитывая мысли http://www.thoughtcrime.org/blog/the-cryptographic-doom-principle/ (короче: ПЕРВОЕ шифрование, ТО аутентификация. После ПЕРВАЯ проверка, ТО дешифрование) Я реализовал следующее решение в узле. ЯШ:
Это может быть проверено с:
Надеюсь это поможет :-)
источник
Я использую blueimp-md5, который «совместим с серверными средами, такими как Node.js, загрузчиками модулей, такими как RequireJS, Browserify или webpack, и всеми веб-браузерами».
Используйте это так:
Если вы передаете хэшированные значения в открытую, всегда полезно посолить их, чтобы людям было труднее их воссоздать:
источник
источник
Даже если хеш не для безопасности, вы можете использовать sha вместо md5. На мой взгляд, люди должны забыть о md5 на данный момент, это в прошлом!
Нормальный nodejs sha256 устарел. Итак, у вас есть две альтернативы:
Я предпочитаю использовать
shajs
вместоhash
, потому что я считаю sha лучшей хэш-функцией в настоящее время, и вам пока не нужна другая хеш-функция. Таким образом, чтобы получить хеш в шестнадцатеричном виде, вы должны сделать что-то вроде следующего:источник