2016-03-16 7 views
7

मैं $2y हैश के साथ पुराने डेटाबेस से निपट रहा हूं। मैंने और $2y के बीच के अंतर पर the stack overflow पर भी कुछ हद तक खोला है।

मैंने bcrypt के लिए नोड मॉड्यूल में देखा जो केवल $2a हैश उत्पन्न और तुलना करता है।

मैं एक वेबसाइट उत्पन्न करता है कि $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 को abcrypt में काम करता है। और twin-bcrypt बस काम करता है।

+1

मैं थोड़ा बेहतर किस्मत अन्य तरीके से काम कर रहे हो रही याद - '$ 2 ए $' 'जावास्क्रिप्ट में bcrypt' द्वारा उत्पन्न हैश ले, साथ की जगह' '2a' 2y ', और उसके बाद अन्य भाषाओं में' 2y' पुस्तकालयों का उपयोग करके तुलना करना (php natively से और .net से 'BCrypt' दोनों इसे संभाल सकता है, जिसने मुझे बहुत अजीब मारा)। मैं आपके पास परीक्षण कोड खोद सकता हूं, अगर यह आपके लिए सहायक होगा। – dvlsg

+1

@dvlsg समझ गया। यह समझ आता है। इसलिए मुझे नोड में '$ 2y' हैश की तुलना करने की आवश्यकता है, PHP में '2 2a' हैश नहीं है, जिसे मैं' a' से 'y' को बदलकर काम अनुमान लगा रहा हूं। – ThomasReggi

+0

हाँ, मैं वास्तव में डेटाबेस में '$ 2y' के रूप में हैशिंग को संग्रहीत कर रहा था, दोनों का उपयोग PHP और .NET दोनों के लिए किया जाता है, लेकिन जब मैंने उन्हें नोड में उपयोग किया तो मेरे पास एक अतिरिक्त रूपांतरण चरण था जो' y' वापस ' तुलना से पहले 'ए'। यह गलत लगा, लेकिन यह '2a' और' 2y' जैसा दिखता था, बाकी नमक/हैश के लिए एक ही संरचना का उपयोग किया जाता था। – dvlsg

उत्तर

1
  • bcrypt परिवर्तन का उपयोग करते समय एक a करने के लिए y
  • twin-bcrypt का उपयोग करते समय हैश बस काम करता है।

http://aspirine.org/htpasswd_en.html का उपयोग करते समय सुनिश्चित करें कि आप उपयोगकर्ता नाम और पासवर्ड प्रदान करते हैं।

reggi helloworld 

तब:

reggi:$2y$10$Am0Nf/B6.S/Wkpr6IVdIZeuHWNa/fqoLyTNmlyrSg22AjRf2vS.T. 

यहाँ bcrypt और twin-bcrypt दोनों के साथ एक काम उदाहरण है।

var twinBcrypt = require('twin-bcrypt') 
var bcrypt = require('bcrypt') 

var string = 'helloworld' 

var bcryptAttempt = bcrypt.compareSync(string, "$2y$10$Am0Nf/B6.S/Wkpr6IVdIZeuHWNa/fqoLyTNmlyrSg22AjRf2vS.T.".replace(/^\$2y/, "$2a")) 
console.log(bcryptAttempt) 

var twinBcryptAttempt = twinBcrypt.compareSync(string, "$2y$10$Am0Nf/B6.S/Wkpr6IVdIZeuHWNa/fqoLyTNmlyrSg22AjRf2vS.T.") 
console.log(twinBcryptAttempt) 

आउटपुट:

true 
true 
+0

आपका मतलब झूठा, सच है? – ShrekOverflow

संबंधित मुद्दे