मैं $2y
हैश के साथ पुराने डेटाबेस से निपट रहा हूं। मैंने और $2y
के बीच के अंतर पर the stack overflow पर भी कुछ हद तक खोला है।
मैंने bcrypt
के लिए नोड मॉड्यूल में देखा जो केवल $2a
हैश उत्पन्न और तुलना करता है।
- https://github.com/ncb000gt/node.bcrypt.js/issues/175
- https://github.com/ncb000gt/node.bcrypt.js/issues/349
- https://github.com/ncb000gt/node.bcrypt.js/issues/213
मैं एक वेबसाइट उत्पन्न करता है कि $2y
हैश, ताकि मैं उन्हें bcrypt
साथ परीक्षण कर सकते हैं पाया।
यहाँ स्ट्रिंग helloworld
के $2y
हैश का एक उदाहरण है।
helloworld:$2y$10$tRM7x9gGKhcAmpeqKEdhj.qRWCr4qoV1FU9se0Crx2hkMVNL2ktEW
लगता मॉड्यूल $2y
हैश मान्य का कोई रास्ता नहीं है।
यहां मेरा परीक्षण है।
// hashesGeneratedUsingAspirineDotOrg
// [ false, false ]
// hashesGeneratedUsingBcryptModule
// [ true, true, true, true, true ]
// hashesGeneratedUsingAspirineDotOrgSwippedYForA
// [ false, false ]
मैं कैसे मैं नोड में $2y
हैश तुलना कर सकते हैं पर स्टम्प्ड हूँ:
var Promise = require('bluebird')
var bcrypt = require('bcrypt')
var string = 'helloworld'
Promise.promisifyAll(bcrypt)
// bcrypt.genSalt(10, function(err, salt) {
// bcrypt.hash(string, salt, function(err, hash) {
// console.log(hash)
// })
// })
var hashesGeneratedUsingBcryptModule = [
'$2a$10$6ppmIdlNEPwxWJskPaQ7l.d2fblh.GO6JomzrcpiD/hxGPOXA3Bsq',
'$2a$10$YmpoYCDHzdAPMbd9B8l48.hkSnylnAPbOym367FKIEPa0ixY.o4b.',
'$2a$10$Xfy3OPurrZEmbmmO0x1wGuFMdRTlmOgEMS0geg4wTj1vKcvXXjk06',
'$2a$10$mYgwmdPZjiEncp7Yh5UB1uyPkoyavxrYcOIzzY4mzSniGpI9RbhL.',
'$2a$10$dkBVTe2A2DAn24PUq1GZYe7AqL8WQqwOi8ZWBJAauOg60sk44DkOC'
]
var hashesGeneratedUsingAspirineDotOrg = [
'$2y$10$MKgpAXLJkwx5tpijWX99Qek2gf/irwvp5iSfxuFoDswIjMIbj2.Ma',
'$2y$10$tRM7x9gGKhcAmpeqKEdhj.qRWCr4qoV1FU9se0Crx2hkMVNL2ktEW'
]
var hashesGeneratedUsingAspirineDotOrgSwippedYForA = [
'$2a$10$MKgpAXLJkwx5tpijWX99Qek2gf/irwvp5iSfxuFoDswIjMIbj2.Ma',
'$2a$10$tRM7x9gGKhcAmpeqKEdhj.qRWCr4qoV1FU9se0Crx2hkMVNL2ktEW'
]
hashesGeneratedUsingBcryptModule = hashesGeneratedUsingBcryptModule.map(hash => bcrypt.compareAsync(string, hash))
hashesGeneratedUsingAspirineDotOrg = hashesGeneratedUsingAspirineDotOrg.map(hash => bcrypt.compareAsync(string, hash))
hashesGeneratedUsingAspirineDotOrgSwippedYForA = hashesGeneratedUsingAspirineDotOrgSwippedYForA.map(hash => bcrypt.compareAsync(string, hash))
Promise.all(hashesGeneratedUsingBcryptModule)
.tap(() => console.log('hashesGeneratedUsingBcryptModule'))
.then(console.log)
Promise.all(hashesGeneratedUsingAspirineDotOrg)
.tap(() => console.log('hashesGeneratedUsingAspirineDotOrg'))
.then(console.log)
Promise.all(hashesGeneratedUsingAspirineDotOrgSwippedYForA)
.tap(() => console.log('hashesGeneratedUsingAspirineDotOrgSwippedYForA'))
.then(console.log)
यहाँ के परिणाम हैं।
another Stack Overflow question/answer है जो कहता है कि आप केवल $2y
से $2a
बदल सकते हैं लेकिन यह अभी भी मेरे लिए विफल रहता है।
अद्यतन!
मैं the generator गलत तरीके से उपयोग कर रहा था क्योंकि यह .htpasswd
पासवर्ड जनरेटर है जिसे आपको इस प्रारूप में उपयोगकर्ता नाम और पासवर्ड डालना होगा।
reggi helloworld
और उत्पादन यहाँ से मेल खाती है:
reggi:$2y$10$iuC7GYH/h1Gl1aDmcpLFpeJXN9OZXZUYnaqD2NnGLQiVGQYBDtbtO
इससे पहले कि मैं के रूप में डाल बस
helloword
कौन सा मैं एक खाली स्ट्रिंग टुकड़ों में बांटा संभालने हूँ।
इन परिवर्तनों के साथ y
को a
bcrypt
में काम करता है। और twin-bcrypt
बस काम करता है।
मैं थोड़ा बेहतर किस्मत अन्य तरीके से काम कर रहे हो रही याद - '$ 2 ए $' 'जावास्क्रिप्ट में bcrypt' द्वारा उत्पन्न हैश ले, साथ की जगह' '2a' 2y ', और उसके बाद अन्य भाषाओं में' 2y' पुस्तकालयों का उपयोग करके तुलना करना (php natively से और .net से 'BCrypt' दोनों इसे संभाल सकता है, जिसने मुझे बहुत अजीब मारा)। मैं आपके पास परीक्षण कोड खोद सकता हूं, अगर यह आपके लिए सहायक होगा। – dvlsg
@dvlsg समझ गया। यह समझ आता है। इसलिए मुझे नोड में '$ 2y' हैश की तुलना करने की आवश्यकता है, PHP में '2 2a' हैश नहीं है, जिसे मैं' a' से 'y' को बदलकर काम अनुमान लगा रहा हूं। – ThomasReggi
हाँ, मैं वास्तव में डेटाबेस में '$ 2y' के रूप में हैशिंग को संग्रहीत कर रहा था, दोनों का उपयोग PHP और .NET दोनों के लिए किया जाता है, लेकिन जब मैंने उन्हें नोड में उपयोग किया तो मेरे पास एक अतिरिक्त रूपांतरण चरण था जो' y' वापस ' तुलना से पहले 'ए'। यह गलत लगा, लेकिन यह '2a' और' 2y' जैसा दिखता था, बाकी नमक/हैश के लिए एक ही संरचना का उपयोग किया जाता था। – dvlsg