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
và $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
.
- 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
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.
Có 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.
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
@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
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