मैं नोड में एक स्ट्रिंग का sha1 हैश कैसे प्राप्त कर सकता हूं।


108

मैं एक websocket नोड नोड में लिखा सर्वर बनाने की कोशिश कर रहा हूँ

सर्वर को काम करने के लिए मुझे एक स्ट्रिंग के SHA1 हैश प्राप्त करने की आवश्यकता है।

मुझे जो करना है वह डॉक्स के सेक्शन 5.2.2 पेज 35 में बताया गया है ।

नोट: एक उदाहरण के रूप में, यदि "Sec-WebSocket-Key" क्लाइंट के हैंडशेक में हेडर का मूल्य "dGhlIHNhbXBsZSBub25jZQ=="होता है, तो सर्वर "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"स्ट्रिंग को बनाने के लिए थ्रस्टिंग को जोड़ देगा "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11"। सर्वर तब इस स्ट्रिंग का SHA-1 हैश लेगा, जिसका मूल्य 0xb3 0x7a 0x4f 0x2c 0x2c 0x62 0x462 0x16 0x90 0xf6 0x46 0x46/x06 0xcf 0x38 0x59 0x452xx2 0xbe 0xc4 0x4 0x4 0 मान देता है। मान देने के लिए यह मान फिर बेस 64-एनकोडेड है "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", जिसे "Sec-WebSocket-Accept"हेडर में वापस किया जाएगा ।


9
मैं अत्यधिक अपने स्वयं के रोल करने के बजाय उत्कृष्ट सॉकेट.आईओ लाइब्रेरी का उपयोग करने की सलाह दूंगा । न केवल इसे बड़े पैमाने पर परीक्षण और पैच किया गया है, बल्कि यह विभिन्न तरीकों के माध्यम से अधिकांश ब्राउज़रों (वेबस्केट एपीआई के बिना उन लोगों को घटना) का समर्थन करता है।
एलेक्स टरपिन 15

1
भविष्य के आगंतुकों के लिए एक अच्छा संदर्भ: stackoverflow.com/questions/9407892/…
दामोदरन

जवाबों:



32

अप्रचलन: SHA1 टूट गया है , आप 45,000 USD के लिए SHA1 टकराव की गणना कर सकते हैं । आपको उपयोग करना चाहिए sha256:

var getSHA256ofJSON = function(input){
    return crypto.createHash('sha256').update(JSON.stringify(input)).digest('hex')
}

अपने प्रश्न का उत्तर देने और SHA1 हैश बनाने के लिए:

const INSECURE_ALGORITHM = 'sha1'
var getInsecureSHA1ofJSON = function(input){
    return crypto.createHash(INSECURE_ALGORITHM).update(JSON.stringify(input)).digest('hex')
}

फिर:

getSHA256ofJSON('whatever')

या

getSHA256ofJSON(['whatever'])

या

getSHA256ofJSON({'this':'too'})

आधिकारिक नोड डॉक्स crypto.createHash()


7
अच्छा विचार। ध्यान दें, हालांकि, सभी ऑब्जेक्ट (सरणियों और अशक्त को छोड़कर) में डिफ़ॉल्ट रूप से Object.toString()रिटर्न के बाद से समान sha1sum मान होगा [object Object]। तो sha1sum({})=== sha1sum({"foo":"bar"})=== sha1sum({"a":1}), आदि
maerics

sha1 (JSON.stringify ("कुछ स्ट्रिंग") => sha1 ("\" कुछ स्ट्रिंग \ "") जो बिल्कुल अपेक्षित नहीं है और प्लेटफ़ॉर्म पार नहीं करता है। कभी-कभी बेहतर ही अच्छे का दुश्मन होता है।
पियरे

3
किसी दिए गए स्ट्रिंग के sha1 को किसी भी प्लेटफ़ॉर्म पर समान होने की उम्मीद है। का उपयोग कर JSON.stringify मूल स्ट्रिंग और sha1sum ( "एबीसीडी") फेरबदल कर रहा है आपका क्रियान्वयन देता f805c8fb0d5c466362ce9f0dc798bd5b3b32d512 जहां किसी को भी 81fe8bfe87576c3ecb22426f8e57847382917acf उम्मीद करेंगे
पियरे

2
@ पियरे यह एक उत्कृष्ट बिंदु है। मुझे लगता है कि फ़ंक्शन sha1sumका नामकरण गलत है जो आपने कहा है - यह स्पष्ट रूप से एक सामान्य sha1 की तुलना में अधिक है। मैंने उत्तर में फ़ंक्शन का नाम बदल दिया है।
मिकमेकाना

वहाँ मानक 80-दौर SHA-1 के अनुसार के लिए आज कोई ज्ञात टक्कर के रूप में है stackoverflow.com/a/3476791/1236215
kzahel

8

कृपया पढ़ें और दृढ़ता से अपनी पोस्ट की टिप्पणियों में मेरी सलाह पर विचार करें। यह कहा जा रहा है, यदि आपके पास अभी भी ऐसा करने का एक अच्छा कारण है, तो नोड के लिए क्रिप्टो मॉड्यूल की इस सूची को देखें । इसमें sha1 और base64 दोनों से निपटने के लिए मॉड्यूल हैं।


7

समस्या (खराब हैश) को रोकने के लिए सुझाव:

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

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

const crypto = require("crypto");

function sha1(data) {
    return crypto.createHash("sha1").update(data, "binary").digest("hex");
}

sha1("Your text ;)");

आप के साथ कोशिश कर सकते हैं: "\ xac", "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ x93", आदि ...

अन्य भाषाएँ (पायथन, पीएचपी, ...):

sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47

NodeJS:

sha1 = crypto.createHash("sha1").update("\xac", "binary").digest("hex") //39527c59247a39d18ad48b9947ea738396a3bc47
//without:
sha1 = crypto.createHash("sha1").update("\xac").digest("hex") //f50eb35d94f1d75480496e54f4b4a472a9148752


1
^ ^ @JossefHarush द्वारा वहां अत्यधिक महत्वपूर्ण टिप्पणी! यदि आपको विशेष रूप से हैशिंग से पहले पाठ को लैटिन 1 के रूप में एनकोड करने की आवश्यकता नहीं है (उदाहरण के लिए PHP के साथ संगतता के लिए), और ऐसा कोई भी मौका है कि आपके पाठ में लैटिन 1 रेंज (जैसे इमोजी!) के बाहर यूनिकोड प्रतीक हैं, का उपयोग न करें binary! उपयोग binaryया latin1एन्कोडिंग में जानकारी खो देंगे और टकराव की संभावना बढ़ जाएगी ! उदाहरण के लिए इन दोनों के साथ ऊपर स्निपेट आज़माएँ: और
cbr

सभी हैश बाइनरी डेटा पर किए जाते हैं। आपके द्वारा अनुभव की जा रही समस्या यह है कि आपके द्वारा उल्लिखित अन्य भाषाएं यूटीएफ -8 का उपयोग नहीं कर रही हैं, न कि अन्य तरीके से। एक बार जब आप लैटिन 1 से बाहर कुछ करने की कोशिश करेंगे तो यह बहुत स्पष्ट हो जाएगा। विशेष रूप से PHP के मामले में, एन्कोडिंग पूरी तरह से स्रोत द्वारा निर्धारित किया जाता है, जैसे कि हार्ड-कोडित पाठ के लिए पाठ फ़ाइल। पर्ल को UTF-8 का उपयोग करने के लिए कुछ भारी उठाने की आवश्यकता हो सकती है।
रयान हानेकैंप

3

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

  const sha1 = require('sha1');
  const crypt = sha1('Text');
  console.log(crypt);

स्थापित करने के लिए:

  sudo npm install -g sha1
  npm install sha1 --save

हाय user944550, स्वागत है। कृपया अधिक जानकारी जोड़ने पर विचार करें।
टिआगो मार्टिंस पेरेज 17
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.