Строка хеша node.js? - PullRequest
       0

Строка хеша node.js?

289 голосов
/ 04 мая 2011

У меня есть строка, которую я хочу хэшировать. Какой самый простой способ создать хеш в файле node.js?

Хеш предназначен для управления версиями, а не безопасности.

Ответы [ 8 ]

631 голосов
/ 08 августа 2012

Если вы просто хотите, чтобы md5 хешировал простую строку, я нашел, что это работает для меня.

var crypto = require('crypto');
var name = 'braitsch';
var hash = crypto.createHash('md5').update(name).digest('hex');
console.log(hash); // 9b74c9897bac770ffc029102a200c5de
200 голосов
/ 04 мая 2011

Взгляните на crypto.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);
});
77 голосов
/ 06 ноября 2012

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.)

API этих модулей не изменится!

18 голосов
/ 14 мая 2016
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"):

    sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47
    
  • Узлы по умолчанию (без двоичного кода):

    sha1("\xac") //f50eb35d94f1d75480496e54f4b4a472a9148752
    
12 голосов
/ 05 апреля 2017

Модуль crypto делает это очень просто.

Настройка:

const crypto = require('crypto');

const sha256 = x => crypto.createHash('sha256').update(x, 'utf8').digest('hex');

Использование:

sha256('Hello, world. ');
8 голосов
/ 10 ноября 2015

Здесь вы можете сравнить все поддерживаемые хэши на вашем оборудовании, поддерживаемые вашей версией node.js.Некоторые из них криптографические, а некоторые просто для контрольной суммы.Его вычисление «Hello World» 1 миллион раз для каждого алгоритма.Для каждого алгоритма может потребоваться около 1-15 секунд (протестировано на стандартном Google Computing Engine с Node.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: 1960 мс
DSA-SHA1: 2062 мс
DSA-SHA1-старое: 2124 мс
RSA-MD4: 1893 мс
RSA-MD5: 1982 мс
RSA-MDC2: 2797 мс
RSA-RIPEMD160: 2101мс
RSA-SHA: 1948 мс
RSA-SHA1: 1908 мс
RSA-SHA1-2: 2042 мс
RSA-SHA224: 2176 мс
RSA-SHA256: 2158 мс
RSA-SHA384: 2290 мс
RSA-SHA512: 2357 мс
дса. Шифрование: 1936 мс
дс с SHHA: 1910 мс
дсаWithSHA1: 1926 мс
дсс1: 1928 мс
экдса-с-SHA1: 1880 мс: 1080 мс1833ms
md4WithRSAEcryption: 1925ms
md5: 1863ms
md5WithRSAEncryption: 1923ms
mdc2: 2729ms
mdc2WithRSA: 2890ms
созревший: 2101ms11033 * rmd160: 2146ms
sha: 1929ms
sha1: 1880ms
sha1WithRSAEcryption: 1957ms
sha224: 2121ms
sha224WithRSAEncryption: 2290мс
sha256: 2134мс
sha256 с шифрованием RSA: 2190мс
sha384: 2181мс
sha384WithRSAEcryption: 2343мс
sha512: 2371мс
sha512 * sha512 * 10SRS2: шифрование * 10: * * * 10md5: 1853 мс
ssl3-md5: 1868 мс
ssl3-sha1: 1971 мс
джакузи: 2578 мс

1 голос
/ 13 октября 2016

Я использую 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);
}
1 голос
/ 18 апреля 2016

Учитывая мысли от http://www.thoughtcrime.org/blog/the-cryptographic-doom-principle/ (короче: ПЕРВЫЙ зашифрован, ТОГДА аутентифицируйся. После ПЕРВЫЙ проверяй, ТОГДА дешифруй) Я реализовал следующее решение в node.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));

Надеюсь, это поможет: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...