2016-03-16 43 views
7

我正在處理一箇舊數據庫,其中包含$2y哈希值。我已經深入瞭解了這一點,也發現了和$2y之間的區別。

我看着節點模塊bcrypt似乎生成並僅比較$2a散列。

我發現了一個網站,產生$2y哈希這樣我就可以bcrypt測試。

這裏有一個$2y哈希字符串helloworld的一個例子。

helloworld:$2y$10$tRM7x9gGKhcAmpeqKEdhj.qRWCr4qoV1FU9se0Crx2hkMVNL2ktEW 

看來模塊沒有驗證$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) 

下面是結果:

// hashesGeneratedUsingAspirineDotOrg 
// [ false, false ] 
// hashesGeneratedUsingBcryptModule 
// [ true, true, true, true, true ] 
// hashesGeneratedUsingAspirineDotOrgSwippedYForA 
// [ false, false ] 

我難倒我如何在節點比較$2y哈希值。

another Stack Overflow question/answer,說你可以只改變$2y$2a,但還是失敗了我。

更新!

我錯誤地使用了the generator,因爲它是一個.htpasswd密碼生成器,您必須以此格式輸入用戶名和密碼。

reggi helloworld 

和輸出對應的位置:

reggi:$2y$10$iuC7GYH/h1Gl1aDmcpLFpeJXN9OZXZUYnaqD2NnGLQiVGQYBDtbtO 

之前,我作爲把剛剛

helloword 

這我假設散列一個空字符串。

由於這些變化將y更改爲abcrypt工程。而twin-bcrypt只是工作。

+1

我依稀記得有更好的運氣工作的另一種方式 - 以'$ 2A $''通過javascript中bcrypt'產生的哈希值,以取代''2a' 2Y ',然後使用其他語言的'2y'庫(本地php和來自.net的'BCrypt')都可以處理它,這讓我覺得很奇怪)。我可以挖掘我的測試代碼,如果這對你有幫助。 – dvlsg

+1

@dvlsg明白了。這就說得通了。所以我需要比較節點中的$ 2y哈希值,而不是php中的$ 2a哈希值,我猜這是通過將'a'替換爲'y'來實現的。 – ThomasReggi

+0

是的,我實際上是在數據庫中存儲哈希值爲'$ 2y',將它們原樣用於PHP和.NET,但是當我在節點中使用它們時,我有一個額外的轉換步驟,將'y'交換回比較之前的'a'。它感覺不對,但它看起來像'2a'和'2y'對於salt/hash的其餘部分使用相同的結構。 – dvlsg

回答

1
  • 使用bcrypt時,將y更改爲a
  • 當使用twin-bcrypt散列正常。

使用http://aspirine.org/htpasswd_en.html時,請確保您提供用戶名和密碼。

reggi helloworld 

然後:

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

這裏既bcrypttwin-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