2016-03-16 13 views
7

Tôi đang xử lý một cơ sở dữ liệu cũ với các dấu băm $2y. Tôi đã đào sâu vào điều này một chút, cũng vấp ngã trên the stack overflow về sự khác biệt giữa $2a$2y.

Tôi đã xem mô-đun nút cho bcrypt có vẻ như chỉ tạo và so sánh chỉ các dấu băm $2a.

Tôi tìm thấy một trang web mà tạo ra $2y băm vì vậy tôi có thể kiểm tra chúng bằng bcrypt.

Dưới đây là một ví dụ về một hash $2y của chuỗi helloworld.

helloworld:$2y$10$tRM7x9gGKhcAmpeqKEdhj.qRWCr4qoV1FU9se0Crx2hkMVNL2ktEW 

Có vẻ như mô-đun không có cách xác thực hợp lệ $2y băm.

Đây là bài kiểm tra của tôi.

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) 

Dưới đây là kết quả:

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

Tôi đang bối rối về cách tôi có thể so sánh $2y băm trong nút.

another Stack Overflow question/answer cho biết bạn chỉ có thể thay đổi $2y thành $2a nhưng điều đó vẫn không thành công đối với tôi.

Cập nhật!

Tôi đã sử dụng the generator không chính xác vì đó là máy phát mật khẩu .htpasswd mà bạn phải đặt vào tên người dùng và mật khẩu ở định dạng này.

reggi helloworld 

Và đầu ra tương ứng ở đây:

reggi:$2y$10$iuC7GYH/h1Gl1aDmcpLFpeJXN9OZXZUYnaqD2NnGLQiVGQYBDtbtO 

Trước khi tôi như đặt chỉ

helloword 

nào tôi giả băm một chuỗi rỗng.

Với những thay đổi này, hãy thay đổi y thành a hoạt động trong bcrypt. Và twin-bcrypt chỉ hoạt động.

+1

Tôi lờ mờ nhớ lại có may mắn hơn làm việc theo cách khác - lấy '$ 2a $ 'băm được tạo ra bởi' bcrypt' trong javascript, thay thế' 2a' với '2y ', và sau đó so sánh bằng cách sử dụng' 2y' thư viện trong các ngôn ngữ khác (php nguyên bản và 'BCrypt' từ. Net có thể cả hai xử lý nó, mà đánh tôi rất lẻ). Tôi có thể khai thác mã thử nghiệm mà tôi có, nếu điều đó có ích cho bạn. – dvlsg

+1

@dvlsg OK. Điều đó có ý nghĩa. Vì vậy, tôi cần phải so sánh băm '$ 2y' trong nút, không phải băm' $ 2a' trong php, mà tôi đoán nó hoạt động bằng cách thay thế 'a' thành' y'. – ThomasReggi

+0

Vâng, tôi đã thực sự lưu trữ băm như '$ 2y' trong cơ sở dữ liệu, sử dụng chúng như là cho cả PHP và .NET, nhưng khi tôi sử dụng chúng trong nút, tôi đã có bước chuyển đổi bổ sung hoán đổi' y' trở lại 'a' trước khi so sánh. Nó cảm thấy sai, nhưng nó trông giống như '2a' và '2y' sử dụng cấu trúc tương tự cho phần còn lại của muối/băm. – dvlsg

Trả lời

1
  • Khi sử dụng bcrypt thay đổi y thành a.
  • Khi sử dụng twin-bcrypt hàm băm chỉ hoạt động.

Khi sử dụng http://aspirine.org/htpasswd_en.html hãy đảm bảo rằng bạn cung cấp tên người dùng và mật khẩu.

reggi helloworld 

Sau đó:

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

Dưới đây là một ví dụ làm việc với cả hai 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) 

Đầu ra:

true 
true 
+0

bạn có nghĩa là sai, đúng không? – ShrekOverflow

Các vấn đề liên quan