8 ответов:
посмотри крипто.createHash (алгоритм)
var filename = process.argv[2]; var crypto = require('crypto'); var fs = require('fs'); var md5sum = crypto.createHash('md5'); var s = fs.ReadStream(filename); s.on('data', function(d) { md5sum.update(d); }); s.on('end', function() { var d = md5sum.digest('hex'); console.log(d + ' ' + filename); });
Если вы просто хотите MD5 хэш простой строки я нашел это работает для меня.
var crypto = require('crypto'); var name = 'braitsch'; var hash = crypto.createHash('md5').update(name).digest('hex'); console.log(hash); // 9b74c9897bac770ffc029102a200c5de
узла модуль крипто API по-прежнему остается нестабильной.начиная с версии 4.0.0, собственный крипто модуль больше не является нестабильным. Из официальная документация:
крипто
Стабильность: 2 - Стабильный
API-интерфейс зарекомендовал себя удовлетворительно. Совместимость с экосистемой НПМ является высоким приоритетом, и не будет нарушен, если абсолютно необходимый.
таким образом, следует считать безопасным использование собственной реализации без внешних зависимостей.
для справки, упомянутые ниже модули были предложены в качестве альтернативных решений, когда крипто модуль был все еще нестабильным.
вы также можете использовать один из модулей в 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.)
API этих модулей не изменится!
sha256("string or binary");я испытал проблему с другим ответом. Я советую вам установить аргумент кодировки в
binaryдля использования байтовой строки и предотвращения различного хэша между Javascript (NodeJS) и другими языками/службами, такими как Python, PHP, Github...если вы не используете этот код, вы можете получить другой хэш между NodeJS и Python...
Как получить тот же хэш, что Python, PHP, Perl, Github (и предотвратить проблему):
NodeJS хеширует UTF-8 представление строки. Другие языки (например, Python, PHP или PERL...) являются хэширования байтовую строку.
мы можем добавить binary аргумент для использования байтовой строки.
код :
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");документы:
- крипто.createHash (алгоритм [, параметры]): алгоритм зависит от доступных алгоритмов, поддерживаемых версией OpenSSL на платформа.
- хэш.дайджест([кодировка]): кодировка может быть 'наговор', 'латинских типа 1" или "в base64'. (базовая 64 менее больше).
вы можете получить проблемы с : и SHA256("\Хас"), "\настоящие xd1", "\xb9", "\XE2 в", "\xBB по", "\x93" и т. д...
другие языки (например, PHP, Python, Perl...) и мое решение с
.update(data, "binary"):sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47Nodejs по умолчанию (без двоичного кода) :
sha1("\xac") //f50eb35d94f1d75480496e54f4b4a472a9148752
The
cryptoмодуль делает это очень легко.настройка:
const crypto = require('crypto'); const sha256 = x => crypto.createHash('sha256').update(x, 'utf8').digest('hex');использование:
sha256('Hello, world. ');
здесь вы можете проверить все поддерживаемые хэши на вашем оборудовании, поддерживаемые вашей версией узла.js. Некоторые из них являются криптографическими, а некоторые-только для контрольной суммы. Его вычисление "Hello World" 1 миллион раз для каждого алгоритма. Это может занять около 1-15 секунд для каждого алгоритма (тестируется на стандартном вычислительном движке Google с узлом.js 4.2.2).
for(var i1=0;i1<crypto.getHashes().length;i1++){ var Algh=crypto.getHashes()[i1]; console.time(Algh); for(var i2=0;i2<1000000;i2++){ crypto.createHash(Algh).update("Hello World").digest("hex"); } console.timeEnd(Algh); }результат:
DSA: 1992ms
DSA-SHA: 1960ms
DSA-SHA1: 2062ms
DSA-SHA1-старый: 2124ms
RSA-MD4: 1893ms
RSA-MD5: 1982ms
RSA-MDC2: 2797ms
RSA-RIPEMD160: 2101ms
RSA-SHA: 1948ms
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-with-SHA1: 1880ms
md4: 1833ms
md4WithRSAEncryption: 1925ms
md5: 1863ms
md5WithRSAEncryption: 1923ms
mdc2: 2729ms
mdc2WithRSA: 2890ms
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: 1868ms
ssl3-sha1: 1971ms
whirlpool: 2578ms
учитывая мысли от http://www.thoughtcrime.org/blog/the-cryptographic-doom-principle/ (короче говоря: сначала зашифруйте, а затем аутентифицируйте. После этого сначала проверьте, а затем расшифруйте) Я реализовал следующее решение в узле.js:
function encrypt(text,password){ var cipher = crypto.createCipher(algorithm,password) var crypted = cipher.update(text,'utf8','hex') crypted += cipher.final('hex'); return crypted; } function decrypt(text,password){ var decipher = crypto.createDecipher(algorithm,password) var dec = decipher.update(text,'hex','utf8') dec += decipher.final('utf8'); return dec; } function hashText(text){ var hash = crypto.createHash('md5').update(text).digest("hex"); //console.log(hash); return hash; } function encryptThenAuthenticate(plainText,pw) { var encryptedText = encrypt(plainText,pw); var hash = hashText(encryptedText); return encryptedText+"$"+hash; } function VerifyThenDecrypt(encryptedAndAuthenticatedText,pw) { var encryptedAndHashArray = encryptedAndAuthenticatedText.split("$"); var encrypted = encryptedAndHashArray[0]; var hash = encryptedAndHashArray[1]; var hash2Compare = hashText(encrypted); if (hash === hash2Compare) { return decrypt(encrypted,pw); } }его можно испытать с:
var doom = encryptThenAuthenticate("The encrypted text",user.cryptoPassword); console.log(VerifyThenDecrypt(doom,user.cryptoPassword));надеюсь, что это помогает :-)
Я использую 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); }
Comments