Mam do czynienia ze starą bazą danych z hashe $2y
. Wkopiłem się w to trochę, natknąłem się również na the stack overflow na różnicę między $2a
i $2y
.
Sprawdziłem moduł węzła pod kątem bcrypt
, który wydaje się generować i porównywać tylko skróty $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
znalazłem stronę internetową, która generuje $2y
hashe więc mogę przetestować je bcrypt
.
Oto przykład $2y
hash ciąg helloworld
.
helloworld:$2y$10$tRM7x9gGKhcAmpeqKEdhj.qRWCr4qoV1FU9se0Crx2hkMVNL2ktEW
Wydaje się, że moduł nie ma możliwości sprawdzania $2y
skrótów.
Oto mój test.
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)
Oto wyniki:
// hashesGeneratedUsingAspirineDotOrg
// [ false, false ]
// hashesGeneratedUsingBcryptModule
// [ true, true, true, true, true ]
// hashesGeneratedUsingAspirineDotOrgSwippedYForA
// [ false, false ]
jestem zakłopotany, w jaki sposób mogę porównać $2y
mieszań w węźle.
Istnieje another Stack Overflow question/answer, który mówi, że można po prostu zmienić $2y
na $2a
, ale nadal mi się nie uda.
Zaktualizować!
Użyłem niepoprawnie nazwy the generator, ponieważ jest to generator haseł .htpasswd
, w którym należy wpisać nazwę użytkownika i hasło w tym formacie.
reggi helloworld
a wyjście odpowiada tutaj:
reggi:$2y$10$iuC7GYH/h1Gl1aDmcpLFpeJXN9OZXZUYnaqD2NnGLQiVGQYBDtbtO
Przed I jak umieszczenie tylko
helloword
którego jestem zakładając mieszany jest pusty ciąg.
Po wprowadzeniu tych zmian zmiana y
na a
działa w bcrypt
. I twin-bcrypt
po prostu działa.
ja niejasno przypominam mający więcej szczęścia pracuje w inny sposób - podając '$ 2a $' skrótów generowanych przez 'bcrypt' w javascript, zastępując' '2a' z 2Y ', a następnie porównywanie przy użyciu bibliotek' 2y' w innych językach (php natywnie i 'BCrypt' z .net może obsłużyć to, co wydało mi się bardzo dziwne). Mogę wykopać kod testowy, który miałem, gdyby ci to było pomocne. – dvlsg
@dvlsg Rozumiem. To ma sens. Muszę więc porównać hashe "$ 2y" w węźle, a nie "2aa' hasze w php, które domyślam się, zastępując' a' do 'y'. – ThomasReggi
Tak, faktycznie przechowywałam skróty jako '$ 2y' w bazie danych, używając ich tak jak dla PHP i .NET, ale kiedy używałam ich w węźle, miałam dodatkowy krok konwersji, który zamienił' y' z powrotem na "a" przed porównaniem. Czułem się nie tak, ale wyglądało na to, że '2a' i' 2y' użyli tej samej struktury dla reszty soli/hasha. – dvlsg