bcrypt, ադապտացված կրիպտոգրաֆիկական հեշ-ֆունկցիա, որը նախատեսված է գաղտանաբառերի կոդավորման համար։ Ֆունկցիան ստեղծվել է Նիլս Պրովոսի և David Mazières-ի կողմից։ Ֆունկցիան հիմնված է Blowfish-ի վրա, որը առաջին անգամ ներկայացվել է USENIX-ին 1999 թվականին[1]։ Ֆունկցիան համարվում է ադապտացված՝ իր աշխատանքի ժամանակ կարելի է դադաղեցնել գործընթացը, որպեսզի դժվարացնում հաքերիների կատարած հարձակումները։

Blowfish-ն տարբերվում է շատ ալգորիթմներից իր կոդավորման բարդ բանալիներով։

Պրովոսը և Mazières-ը օգտագործեցին այս յուրահատկությունը, սակայն փոփոխեցին այդ բանալիները, ստանալով «Eksblowfish» (expensive key schedule Blowfish) կոդավորումը։

Առաջին տարբերակը ստեղծվեց crypt ֆունկցիայով OpenBSD-ով։ Գոյություն ունեն նաև տարբերակներ Java, Python, Nim, C#, Ruby, Perl, PHP 5.3, Node.js, Go և մի քանի այլ տարբերակների համար[2]։

Ալգորիթմ խմբագրել

bcrypt ալգորիթը օգտոգործում է Eksblowfish բանալին․

EksBlowfishSetup(cost, salt, key)
    state   InitState()
    state   ExpandKey(state, salt, key)
    repeat (2cost)
        state   ExpandKey(state, 0, key)
        state   ExpandKey(state, 0, salt)
    return state

InitState ֆունկցիան համապատասխանում է Blowfish օրիգինալ ֆունկցիային՝ P և S-box զանգվածը լրացնելու համար օգտագործվում է թվի   մասը։

ExpandKey ֆունկցիա․

ExpandKey(state, salt, key)
    for(n = 1..18)
        Pn   key[32(n-1)..32n-1]   Pn //treat the key as cyclic
    ctext   Encrypt(salt[0..63])
    P1   ctext[0..31]
    P2   ctext[32..63]
    for(n = 2..9)
        ctext   Encrypt(ctext   salt[64(n-1)..64n-1]) //encrypt using the current key schedule and treat the salt as cyclic
        P2n-1)   ctext[0..31]
        P2n   ctext[32..63]
    for(i = 1..4)
        for(n = 0..127)
            ctext   Encrypt(ctext   salt[64(n-1)..64n-1]) //as above
            Si[2n]   ctext[0..31]
            Si[2n+1]   ctext[32..63]
    return state


Հեշի հաշվարկի համար bcrypt-ը մշակում է ներմուծվող տվյալները համարժեք կոդավորմամբ՝ eksblowfish․

bcrypt(cost, salt, key, input)
    state   EksBlowfishSetup(cost, salt, key)
    ctext   input
    repeat (64)
        ctext   EncryptECB(state, ctext) 
    return Concatenate(cost, salt, ctext)

Թերություններ խմբագրել

bcrypt-ը մշակվել է 1999 թվականին և պաշտպանված է եղել այն ժամանակների հարձակումների հանդեպ։ Ներկա պահին այն ստացել է ծրագրավորման լոգիկա, որոնց շնորհիվ այն շարունակում է մնալ պաշտշանված։ 2009 թվականին ստեղծվել էր scrypt ալգորիթմը, որի աշխատանքի համար անհրաժեշտ էր հիշողության մեծ ծավալ[3]։

Ծանոթագրություններ խմբագրել

  1. Provos, Niels; Mazières, David A Future-Adaptable Password Scheme (und) // Proceedings of 1999 USENIX Annual Technical Conference. — 1999. — С. 81—92.
  2. «Package bcrypt» (անգլերեն). godoc.org. Վերցված է 2020 թ․ հունվարի 10-ին.
  3. http://www.unlimitednovelty.com/2012/03/dont-use-bcrypt.html «Not only does scrypt give you more theoretical safety than bcrypt per unit compute time, but it also allows you to configure the amount of space in memory needed to compute the result.»

Արտաքին հղումներ խմբագրել