2015-07-14 18 views
10

Sto cercando di trovare la stringa hash bcrypt usando regex (in PowerGrep), in un database.Espressione regolare per trovare bcrypt hash?

provato questo regex:

{?A-Za-z_0-9.{60}}? 

Ma viene trovata una corrispondenza. L'hash di Bcrypt ha una lunghezza di 60 caratteri e inizia con "$ 2y $".

Esempio:

$2y$15$nK/B6u765645/lo0867h56546v/BnH5U5g45Aj67u67nMVtrhryt6 

risposta

3

tua regex - {?A-Za-z_0-9.{60}}? - contiene gli intervalli non una classe di caratteri [...], ma all'interno di parentesi graffe opzionali, e quindi presentano sequenze di caratteri letterali. Vedi your regex demo per vedere cosa intendo.

È possibile utilizzare la seguente espressione regolare:

^\$2y\$.{56}$ 

Vedi demo

Il ^ corrisponde l'inizio della stringa, \$2y\$ partite $2y$ letteralmente (come $ è un carattere speciale e deve fuggire) e .{56} è il resto 56 caratteri.

18

Proprio come un'aggiunta alla risposta di cui sopra da @stribizhev. Gli hash di bcrypt che potresti incontrare in natura sono disponibili in alcune varietà, quindi potresti dover modificare la regex per catturarli tutti. Le variazioni sono i seguenti:

La parte "Algorithm Identifier" del hash possono includere:

  • "2" - la prima revisione del bcrypt, che soffre di una falla di sicurezza minore e generalmente non più utilizzato .

  • "2a" - alcune implementazioni hanno sofferto di un difetto di sicurezza molto raro.

  • "2y" - formato specifico dell'implementazione BCrypt di crypt_blowfish, identico a "2a" in tutto tranne il nome.

  • "2b" - ultima revisione dell'algoritmo ufficiale bcrypt

^\$2[ayb]\$.{56}$ 

sembra funzionare per me

Vedi qui per la ripartizione di un hash bcrypt: Can someone explain how BCrypt verifies a hash?

+2

Ho aggiornato la tua espressione regolare per essere un po 'più precisa: '^ \ $ 2 [ayb] \ $ [0-9] {2 } \ $ [A-Za-z0-9 \. \ /] {53} $ '. Questo controlla il valore di costo dopo l'identificatore della versione e perfeziona la classe di caratteri per i bit di hash e di sale. A seconda dell'interprete, potrebbe non essere necessario sfuggire a '/' nella regex. Per il valore di costo, questo semplicemente controlla il formato, non se il valore è valido (i valori validi sono 4-31, inclusi). – Rand

+0

Nel corso del tempo, la lunghezza potrebbe essere superiore a 60 se si esegue la crittografia utilizzando la nuova funzione password_hash di php. Per questo motivo, un'espressione regolare di '^ \ $ 2 [ayb] \ $. + $' Potrebbe essere più appropriata. – GRA0007

0

Utilizzare questo :

^\$2[aby]?\$\d{1,2}\$[.\/A-Za-z0-9]{53}$ 

Spiegazione:

  • \$2[aby]?\$ - corrisponde l'algoritmo utilizzato.I valori validi sono 2, 2a, 2y e 2b
  • \d{1,2}\$ - corrisponda al costo, o quanti giri, che è un numero intero compreso tra 4 e 31 (compreso)
  • [.\/A-Za-z0-9]{53} - corrisponde il sale e l'hash, con il sale compongono i primi 22 caratteri e la password hash che costituisce l'ultimo 31
Problemi correlati