bcrypt

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

bcrypt este o funcție de hash de parolă proiectată de Niels Provos și David Mazières , bazată pe criptarea Blowfish și introdusă la USENIX în 1999. Pe lângă încorporarea unei săruri pentru a proteja parola împotriva atacurilor de masă curcubeu , bcrypt este o funcție adaptativă: în timp, numărul de iterații poate fi mărit pentru a-l face mai lent, pentru a fi rezistent la atacurile de forță brută chiar și cu o capacitate de calcul crescută.

Funcția bcrypt este algoritmul implicit de eliminare a parolei pentru BSD și alte sisteme, inclusiv unele distribuții Linux, cum ar fi SUSE Linux . Prefixul „$ 2a $” sau „$ 2b $” (sau „$ 2y $”) dintr-un șir de hash într-un fișier de parolă shadow indică faptul că șirul de hash este un format de hash modular bcrypt. Restul șirului de hash include parametrul de cost, o sare pe 128 de biți (base64 codată cu 22 de caractere) și 184 de biți din valoarea hash rezultată (base64 codată cu 31 de caractere). Parametrul cost specifică un număr iterativ de extindere a cheii într-o putere de două, care este o intrare în algoritmul de criptare.

De exemplu, parola shadow înregistrează $2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy specifică un parametru de cost de 10, indicând 2 10 ca runde de expansiune cheie. Sarea este N9qo8uLOickgx2ZMRZoMye și N9qo8uLOickgx2ZMRZoMye rezultat este IjZAgcfl7p92ldGxad68LJZdL17lhWy . Prin practica standard, propria parolă a utilizatorului nu este stocată.

Există implementări ale bcrypt pentru C, C #, Java, JavaScript, Perl, PHP, Python, Ruby și alte limbaje.

fundal

Blowfish este proeminent printre cifrele bloc, datorită etapei sale costisitoare de configurare a cheii. Începe cu subchei într-o stare standard, apoi folosește această stare pentru a efectua un cifru bloc folosind o parte a cheii și folosește rezultatul acelui cifru (care este mai precis un hash) pentru a înlocui unele dintre subchei. Apoi folosește această stare modificată pentru a cripta alte părți ale cheii și folosește rezultatul pentru a înlocui alte subchei. Se procedează astfel, folosind o stare modificată progresiv pentru a hashia cheia și a înlocui bucăți din stat, până când toate subcheile au fost stabilite.

Provos și Mazières au exploatat acest lucru și l-au continuat. Au dezvoltat un nou algoritm de configurare a cheii pentru Blowfish, denumind criptarea rezultată „Eksblowfish” („programul de chei scump Blowfish”). Configurarea cheii începe cu o formă modificată a standardului de configurare a cheii Blowfish, în care atât sarea, cât și parola sunt utilizate ca subchei. Prin urmare, există o serie de schimbări în care se aplică algoritmul standard Blowfish, utilizând alternativ sarea și parola ca cheie, în care fiecare rundă începe cu starea de subcheie a rundei anterioare. În teorie, nu există nimic mai puternic decât standardul Blowfish, dar numărul de runde de recodare este configurabil; acest proces poate fi apoi realizat în mod arbitrar lent, ajutând la descurajarea atacurilor de forță brută asupra hashului sau a sării.

Algoritm

Algoritmul bcrypt depinde în mare măsură de algoritmul de configurare a cheii „Eksblowfish”, care rulează după cum urmează:

 EksBlowfishSetup ( cost , sare , cheie )
    fost    InitState ()
    fost    ExpandKey ( stare , sare , cheie )
    repeta (2 cost )
        fost    ExpandKey (stare, 0, cheie)
        fost    ExpandKey (stare, 0, sare)
    starea de întoarcere

InitState funcționează ca algoritmul original Blowfish, populând intrările P-array și S-box cu o parte fracționată a \ pi în hex.

Funcția ExpandKey este următoarea:

 ExpandKey ( stare , sare , cheie )
    pentru ( n = 1..18)
        P nr    tasta [32 (n-1) .. 32n-1]    P n // tratează cheia ca fiind ciclică
    ctext    Criptare ( sare [0..63])
    P 1    ctext [0..31]
    P 2    ctext [32..63]
    pentru ( n = 2..9)
        ctext    Criptare ( ctext    salt [64 (n-1) .. 64n-1]) // criptează folosind programul actual al cheilor și tratează sarea ca fiind ciclică
        P 2n-1)    ctext [0..31]
        P 2n    ctext [32..63]
    pentru ( i = 1..4)
        pentru ( n = 0..127)
            ctext    Criptare ( ctext    sare [64 (n-1) .. 64n-1]) // ca mai sus
            S i [2n]    ctext [0..31]
            S i [2n + 1]    ctext [32..63]
    starea de întoarcere

Ca rezultat, ExpandKey( state , 0, key ) este același cu programul cheie obișnuit al lui Blowfish, deoarece toate XOR-urile cu valoarea cresc complet la 0 sunt neconcludente. ExpandKey( state , 0, salt ) este similară, dar folosește sarea ca cheie pe 128 de biți.

Algoritmul bcrypt complet folosește aceste funcții pentru a calcula un hash dintr-o intrare dată derivată din parolă, după cum urmează:

 bcrypt ( cost , sare , intrare )
    fost    EksBlowfishSetup ( cost , sare , intrare )
    ctext    „OrpheanBeholderScryDoubt” // trei blocuri pe 64 de biți
    repeta (64)
        ctext    EncryptECB ( state , ctext ) // criptează folosind Blowfish standard în modul ECB
    return Concatenate ( cost , sare , ctext )

Introducere utilizator

Multe implementări ale bcrypt trunchează parola la primii 72 de octeți.

Algoritmul matematic în sine necesită o inițializare cu 18 subchei de 32 de biți (echivalent cu 72 de octeți / octeți). Specificația originală bcrypt nu impune nicio metodă specială pentru maparea parolelor bazate pe text de la spațiul utilizatorului la valorile numerice ale algoritmului. Un scurt comentariu din text menționează, dar nu ordonă, capacitatea de a utiliza pur și simplu valoarea codificată ASCII a unui șir de caractere, „În cele din urmă, argumentul cheie este o cheie secretă de criptare, care poate fi o parolă aleasă de utilizator până la 56 de octeți (inclusiv un sfârșit de 0 octeți când cheia este un șir ASCII). "

Rețineți că citatul de mai sus menționează parolele „până la 56 de octeți”, chiar dacă algoritmul în sine folosește o valoare inițială de 72 de octeți. Deși Provos și Mazières nu indică motivul acestei scurte restricții, acestea ar fi putut fi motivate de următoarea afirmație din specificația originală a lui Bruce Schneier Blowfish, „Limita de dimensiune a cheii de 448 [biți] asigură faptul că fiecare bit din fiecare subcheie depinde de fiecare bit a cheii. "

Implementările au variat în abordarea lor de conversie a parolelor la valori numerice inițiale, incluzând uneori reducerea puterii parolelor care conțin caractere speciale.

Elemente conexe

  • Criptă (C) # Criptă schemă bazată pe Blowfish - schemă de verificare și stocare a parolei - Blowfish
  • Întinderea cheii
  • PBKDF2 (Funcția de derivare a cheii bazată pe parolă 2)
  • scripta

linkuri externe

  • Bcrypt , pe packages.debian.org . Editați pe Wikidata