Bcrypt

bcrypt — адаптивна криптографічна функція формування ключа, що використовується для безпечного зберігання паролів. Розробники: Нільс Провос[en] і David Mazières. Функція заснована на шифрі Blowfish, вперше представлена на USENIX у 1999 році[1]. Для захисту від атак за допомогою райдужних таблиць bcrypt використовує сіль (salt); крім того, функція є адаптивною, час її роботи легко налаштовується і її можна сповільнити, щоб ускладнити атаки перебором.

Шифр Blowfish відрізняється від багатьох алгоритмів обчислювально складною фазою підготовки ключів шифрування. Провос і Mazières скористалися цією особливістю, але змінили алгоритм підготовки ключів, отримавши шифр «Eksblowfish» (expensive key schedule Blowfish). Кількість раундів у підготовці ключів має бути ступенем двійки; конкретна ступінь може задаватися при використанні bcrypt.

Спочатку реалізовано функції crypt в OpenBSD. Існують реалізації для Java, Python, Nim, C#, Ruby, Perl, PHP 5.3, Node.js та деяких інших.

Алгоритм

Алгоритм bcrypt використовує алгоритм налаштування ключів з «Eksblowfish»:

EksBlowfishSetup(cost, salt, key)
 state 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 InitState()
 state 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 ExpandKey(state, salt, key)
 repeat (2cost)
 state 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 ExpandKey(state, 0, key)
 state 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 ExpandKey(state, 0, salt)
 return state

Функція InitState відповідає оригінальній функції з шифру Blowfish; для заповнення масиву P і S-box використовується дробова частина числа π {\displaystyle \pi } .

Функція ExpandKey:

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

Для обчислення хешу bcrypt обробляє вхідні дані еквівалентно шифруванню 'eksblowfish(посилений_ключ, input)':

bcrypt(cost, salt, key, input)
 state 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 EksBlowfishSetup(cost, salt, key)
 ctext 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 input
 repeat(64)
 ctext 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 EncryptECB(state, ctext) // шифрування стандартним Blowfish в режимі ECB
 return Concatenate(cost, salt, ctext)

В різних ОС (linux, OpenBSD), використовують алгоритм bcrypt в стандартній функції crypt (3), в якості input подається константа «OrpheanBeholderScryDoubt»[2].

Недоліки

bcrypt був розроблений в 1999 році і був захищений від ефективного перебору на апаратних засобах того часу. В даний час одержали широке поширення ПЛІС, в яких bcrypt реалізується ефективніше. У 2009 був створений алгоритм scrypt, що вимагає для своєї роботи значний обсяг пам'яті (з випадковим доступом), об'єм пам'яті налаштовується[3].

У порівнянні з PBKDF2, алгоритм розширення ключа в bcrypt практично не досліджувався криптографами[4].

Дивись також

  • Crypt (Unix)
  • Crypt (C)
  • PBKDF2
  • scrypt

Посилання

  • jBCrypt — реалізація bcrypt на Java [Архівовано 27 квітня 2018 у Wayback Machine.]
  • py-bcrypt — реалізація bcrypt на Python [Архівовано 22 червня 2017 у Wayback Machine.]
  • BCrypt.Net — реалізація bcrypt на C# [Архівовано 1 липня 2014 у Wayback Machine.]
  • JFBCrypt — реалізація bcrypt на Objective C
  • bcrypt-ruby — реалізація bcrypt на Ruby
  • Crypt::Eksblowfish::Bcrypt — реалізація bcrypt на Perl
  • bcrypt.js — реалізація bcrypt на JavaScript [Архівовано 27 березня 2016 у Wayback Machine.]
  • twin-bcrypt — реалізація bcrypt на JavaScript / asm.js [Архівовано 11 червня 2018 у Wayback Machine.]
  • bcrypt.go — реалізація bcrypt на Go [Архівовано 4 жовтня 2014 у Wayback Machine.]
  • tutanota.com — приклад використання bcrypt в сервісі end-to-end шифрованого пошти [Архівовано 28 січня 2017 у Wayback Machine.]

Примітки

  1. Provos, Niels; Mazières, David; Talan Jason Sutton 2012 (1999). «A Future-Adaptable Password Scheme». Proceedings of 1999 USENIX Annual Technical Conference: 81–92.
  2. Архівована копія (PDF). Архів оригіналу (PDF) за 15 червня 2018. Процитовано 13 квітня 2018.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)
  3. http://www.unlimitednovelty.com/2012/03/dont-use-bcrypt.html [Архівовано 14 квітня 2018 у Wayback Machine.] «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.»
  4. http://www.unlimitednovelty.com/2012/03/dont-use-bcrypt.html [Архівовано 14 квітня 2018 у Wayback Machine.] «Unlike bcrypt, PBKDF2 has been the subject of intense research and still remains the best conservative choice.»
  • п
  • о
  • р
Загальні функції
  • MD5 (скомпрометована)
  • SHA-1 (скомпрометована)
  • SHA-2
  • SHA-3
  • BLAKE2
Фіналісти SHA-3
  • BLAKE
  • Grøstl[en]
  • JH[en]
  • Skein
  • Keccak (переможець)
Інші функції
  • BLAKE3[en]
  • CubeHash[en]
  • ECOH[en]
  • FSB[en]
  • Fugue[en]
  • ГОСТ 34.311-95[ru]
  • HAS-160[en]
  • HAVAL
  • Купина
  • LSH[en]
  • Lane[en]
  • MASH-1[en]
  • MASH-2[en]
  • MD2
  • MD4
  • MD6
  • MDC-2[en]
  • N-Hash
  • RIPEMD[en] (128 160 256[ru])
  • RadioGatún[en]
  • SIMD[en]
  • SM3[en]
  • SWIFFT
  • Shabal[en]
  • Snefru[en]
  • Streebog[en]
  • Tiger
  • VSH[en]
  • Whirlpool
Гешування паролів/
розтягування ключів[en]
  • Argon2
  • Balloon[en]
  • Bcrypt
  • Catena[en]
  • crypt
  • LM hash[en]
  • Lyra2[en]
  • Makwa[en]
  • PBKDF2
  • Scrypt
  • yescrypt[en]
Формування ключа
  • HKDF[en]
  • KDF1/KDF2
Коди автентифікації
повідомлення
  • CBC-MAC
  • DAA[en]
  • GMAC
  • HMAC
  • NMAC[en]
  • OMAC[en]/CMAC[en]
  • PMAC[en]
  • Poly1305[en]
  • SipHash[en]
  • UMAC[en]
  • VMAC[en]
Режими аутентифікованого
шифрування
  • CCM[en]
  • ChaCha20-Poly1305[en]
  • CWC[en]
  • EAX[en]
  • GCM
  • IAPM[en]
  • OCB[en]
Контрольні сумми та
некриптографічні[en]
функції
Атаки (огляд[en])
Конструкції
Стандартизація
  • CAESAR Competition[en]
  • CRYPTREC
  • NESSIE
  • NIST SHA-3
  • Password Hashing Competition[en]
Використання