2016-03-16 26 views
7

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.

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.

+1

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

+1

@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

+0

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

Odpowiedz

1
  • Przy korzystaniu bcrypt Zmienić y do a.
  • Podczas korzystania z twin-bcrypt hash po prostu działa.

Podczas korzystania z http://aspirine.org/htpasswd_en.html upewnij się, że podałeś nazwę użytkownika i hasło.

reggi helloworld 

Następnie:

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

Oto przykład pracuje zarówno bcrypt i 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) 

Wyjścia:

true 
true 
+0

masz na myśli fałsz, prawda? – ShrekOverflow