नोड। हैश स्ट्रिंग?


325

मेरे पास एक स्ट्रिंग है जिसे मैं हैश करना चाहता हूं। नोड .js में हैश उत्पन्न करने का सबसे आसान तरीका क्या है?

हैश संस्करण के लिए है, सुरक्षा नहीं।


जवाबों:


224

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);
});

S.on () फ़ंक्शन क्या कर रहा है? क्या यह रीडस्ट्रीम से पढ़े जा रहे डेटा को निष्पादित करने के लिए md5sum.update (d) फ़ंक्शन को पंजीकृत कर रहा है?
DucRP

@YoniDor क्या आपने fs.readsync की कोशिश की ? - क्लासिक लूप में खोदते हुए, फिर सुनिश्चित करें कि यह हो चुका है ... flow stackoverflow.com/a/21219407/444255
फ्रैंक नॉक

8
ओपी एक स्ट्रिंग हैश करना चाहता है, एक फाइल नहीं।
धुंधला

698

यदि आप बस एक साधारण स्ट्रिंग md5 हैश करना चाहते हैं तो मुझे यह काम मेरे लिए मिला।

var crypto = require('crypto');
var name = 'braitsch';
var hash = crypto.createHash('md5').update(name).digest('hex');
console.log(hash); // 9b74c9897bac770ffc029102a200c5de

181
वूट वूट, अगर आप करते हैं तो require('crypto').createHash('md5').update(STRING_TO_BE_HASHED).digest("hex")आपको वन-लाइनर मिला चीयर्स दोस्त!
बालरूप

3
.updateकई बार ( github.com/joyent/node/issues/749 ) का उपयोग करके कुछ मुद्दों को प्राप्त कर रहा था, जब timboooएक-लाइनर का उपयोग करके इसे ठीक करने की कोशिश कर रहा था (क्योंकि हैश ऑब्जेक्ट को हर बार फिर से बनाया गया है)।
मैक्स

स्ट्रिंग की लंबाई बदलने का कोई तरीका? इतना ही नहीं 32 अक्षर, 64 या 128 या एक अलग संख्या।
मिकेल

@ मिकेल कोशिश करें कि आपकी जरूरतों के हिसाब से अन्य हैश एल्गोरिदम हों, तो md5 हमेशा 32 अक्षर का होता है।
संबंध

अगर मेरे पास हैश के बहुत सारे तार हैं, तो किसी भी तरह रिजल्ट का फिर से उपयोग करने के बजाय crypto.createHash पर कॉल करना कम कुशल है?
माइकल

81

नोड का क्रिप्टो मॉड्यूल एपीआई अभी भी अस्थिर है।

संस्करण 4.0.0 के रूप में, देशी क्रिप्टो मॉड्यूल अब अस्थिर नहीं है। से आधिकारिक दस्तावेज :

क्रिप्टो

स्थिरता: 2 - स्थिर

एपीआई संतोषजनक साबित हुआ है। एनपीएम पारिस्थितिकी तंत्र के साथ संगतता एक उच्च प्राथमिकता है, और जब तक बिल्कुल आवश्यक नहीं तोड़ा नहीं जाएगा।

तो, इसे बाहरी निर्भरता के बिना, मूल कार्यान्वयन का उपयोग करने के लिए सुरक्षित माना जाना चाहिए।

संदर्भ के लिए, क्रिप्टो मॉड्यूल अभी भी अस्थिर होने पर वैकल्पिक समाधान के रूप में उल्लिखित मॉड्यूल का सुझाव दिया गया था।


आप मॉड्यूल 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 जैसी सेवाओं द्वारा उपयोग किया जाता है।)

इन मॉड्यूल का एपीआई नहीं बदलेगा!


9
मुझे लगता है कि क्रिप्टो का उपयोग करने के बजाय एक पूरे नए मॉड्यूल में लाना बहुत आसान और कुशल है।
वलजस

6
वर्तमान Node.js डॉक्स से: "स्थिरता: 2 - अस्थिर। भविष्य के संस्करणों के लिए एपीआई परिवर्तनों पर चर्चा की जा रही है। ब्रेकिंग परिवर्तनों को कम से कम किया जाएगा।" मेरे मॉड्यूल का एपीआई नहीं बदलेगा। जब मैंने शुरू में मॉड्यूल लिखा था, तो प्लेटफॉर्म में कोई crypto मॉड्यूल नहीं बनाया गया था। एक और लाभ यह है कि आप सर्वर पर मेरे मॉड्यूल के साथ-साथ क्लाइंट पक्ष का उपयोग कर सकते हैं। लेकिन यह पूरी तरह से आप पर निर्भर करता है कि आप किस पुस्तकालय का उपयोग करते हैं।
पॉवरब

7
क्रिप्टो हैश में निर्माण ने मुझे 'हैश अपडेट विफल' बी.एस. अंत में मैं एमडी 5 मॉड्यूल में चला गया और यह ठीक काम किया। कॉल करने में आसान (थोड़ा)। धन्यवाद।
GJK

2
एक विकल्प के लिए +1 जो (2) से दूर रहता है - क्रिप्टो एपीआई की अस्थिर प्रकृति!
गीक स्टॉक

1
मैंने इस मॉड्यूल के लिए मानक क्रिप्टो उपयोग की अदला-बदली करके अपने विंडोज मशीन पर नोड 0.11.x पर एक अजीब sha1 समस्या तय की है।
बार्टवाड्स

24
sha256("string or binary");

मैंने अन्य उत्तर के साथ समस्या का अनुभव किया। मैं आपको सलाह देता हूं binaryकि बाइट स्ट्रिंग का उपयोग करने के लिए एन्कोडिंग तर्क सेट करें और जावास्क्रिप्ट (NodeJS) और पायथन, पीएचपी, जीथब जैसी अन्य लैंगेज / सर्विस के बीच अलग-अलग हैश को रोकें ...

यदि आप इस कोड का उपयोग नहीं करते हैं, तो आप NodeJS और पायथन के बीच एक अलग हैश प्राप्त कर सकते हैं ...

एक ही हैश को कैसे प्राप्त करें कि पायथन, पीएचपी, पर्ल, जीथब (और एक समस्या को रोकें):

NodeJS UTF-8 स्ट्रिंग का प्रतिनिधित्व करता है। अन्य भाषाएं (जैसे पायथन, पीएचपी या पर्ल ...) बाइट स्ट्रिंग में हैशिंग हैं।

बाइट स्ट्रिंग का उपयोग करने के लिए हम बाइनरी तर्क जोड़ सकते हैं ।

कोड:

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 (एल्गोरिथ्म [, विकल्प]): एल्गोरिथ्म प्लेटफॉर्म पर ओपनएसएसएल के संस्करण द्वारा समर्थित उपलब्ध एल्गोरिदम पर निर्भर है।
  • hash.digest ([एन्कोडिंग]): एन्कोडिंग 'हेक्स', 'लैटिन 1' या 'बेस 64' हो सकती है। (बेस 64 कम लंबा है)।

आप इस मुद्दे को प्राप्त कर सकते हैं: sha256 ("\ xac"), "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ x93", आदि ...

  • अन्य भाषाएँ (जैसे PHP, पायथन, पर्ल ...) और मेरे समाधान के साथ .update(data, "binary"):

    sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47
  • डिफ़ॉल्ट रूप से (बिना बाइनरी) Nodejs:

    sha1("\xac") //f50eb35d94f1d75480496e54f4b4a472a9148752

15

cryptoमॉड्यूल के लिए यह बहुत आसान बना देता है।

सेट अप:

// import crypto from 'crypto';
const crypto = require('crypto');

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

उपयोग:

sha256('Hello, world. ');

10

यहां आप अपने हार्डवेयर पर सभी समर्थित हैश को नोड.जेएस के अपने संस्करण द्वारा बेंचमार्क कर सकते हैं। कुछ क्रिप्टोग्राफिक हैं, और कुछ सिर्फ एक चेकसम के लिए हैं। प्रत्येक एल्गोरिथ्म के लिए इसकी गणना "हैलो वर्ल्ड" 1 मिलियन बार। प्रत्येक एल्गोरिदम के लिए लगभग 1-15 सेकंड लग सकते हैं (मानक Google कम्प्यूटिंग इंजन पर 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: 1960ms
DSA-SHA1: 2062ms
DSA-SHA1-old: 2124ms
RSA-MD4: 1893ms
RSA-MD5: 1982ms
RSA-MDC2: 2797ms
RSA-RIPEMD160
: 2101ms
RSA-SHA1 : 1948 : 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 md4WithRSAEnc
एन्क्रिप्शन: 1925ms
md5: 1863ms
md5WithRSAEnc एन्क्रिप्शन: 1923ms
mdc2: 2729ms
mdc2WithRSA: 2890ms
ripemd: 2101ms
ripemd160: 2153ms
ripemd160WithRSA: 2210ms
rmd160: 2146ms
शा: 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
भँवर: 2578ms


1
RSA-उपसर्ग क्या करते हैं?
बालुपटन

7

सरल एक लाइनर:

यदि आप UTF8 टेक्स्ट हैश चाहते हैं:

const hash = require('crypto').createHash('sha256').update('Hash me', 'utf8').digest('hex');

यदि आप पायथन, पीएचपी, पर्ल, जीथूब के साथ एक ही हैश प्राप्त करना चाहते हैं:

const hash = require('crypto').createHash('sha256').update('Hash me', 'binary').digest('hex');

तुम भी जगह ले सकता है 'sha256'के साथ 'sha1', 'md5', 'sha256','sha512'


1

Http://www.thoughtcrime.org/blog/the-cryptographic-doom-principle/ (संक्षेप में: FIRST एन्क्रिप्ट, फिर प्रमाणित करें। बाद में सत्यापित करें, फिर से डिक्रिप्ट) से विचारों को ध्यान में रखते हुए मैंने नोड में निम्न समाधान लागू किया है। 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));

उम्मीद है की यह मदद करेगा :-)


1

मैं ब्लिंप-md5 का उपयोग करता हूं, जो "सर्वर साइड वातावरण जैसे Node.js, मॉड्यूल लोडर जैसे आवश्यकताएँ, Browserify या वेबपैक और सभी वेब ब्राउज़र के साथ संगत है।"

इसे इस तरह उपयोग करें:

var md5 = require("blueimp-md5");

var myHashedString = createHash('GreensterRox');

createHash(myString){
    return md5(myString);
}

अगर खुले में चारों ओर हैशेड मान गुजरते हैं, तो उन्हें नमक करना हमेशा एक अच्छा विचार होता है ताकि लोगों के लिए उन्हें फिर से बनाना कठिन हो:

createHash(myString){
    var salt = 'HnasBzbxH9';
    return md5(myString+salt);
}

1
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));

-1

भले ही हैश सुरक्षा के लिए नहीं है, आप md5 के बजाय sha का उपयोग कर सकते हैं। मेरी राय में, लोगों को अभी के लिए md5 के बारे में भूलना चाहिए, यह अतीत में है!

सामान्य नोडज 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, क्योंकि मैं आजकल शा सबसे अच्छा हैश फ़ंक्शन मानता हूं और आपको अब के लिए एक अलग हैश फ़ंक्शन की आवश्यकता नहीं है। तो हेक्स में कुछ हैश पाने के लिए आपको निम्न की तरह कुछ करना चाहिए:

sha256.update('hello').digest('hex')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.