bcrypt

Поделись знанием:
Перейти к: навигация, поиск

Криптографическая</br>хеш-функция
Название

bcrypt

Разработчики

Нильс Провос и David Mazières

Впервые опубликован

1999

Число раундов

2n

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

Шифр Blowfish отличается от многих алгоритмов вычислительно сложной фазой подготовки ключей шифрования (англ.).

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

Изначально реализовано в функции crypt в OpenBSD. Существуют реализации для Java, Python, C#, Ruby, Perl, PHP 5.3, Node.js и некоторых других.





Алгоритм

Алгоритм bcrypt использует алгоритм настройки ключей из «Eksblowfish»:

EksBlowfishSetup(cost, salt, key)
    state <math>\gets</math> InitState()
    state <math>\gets</math> ExpandKey(state, salt, key)
    repeat (2cost)
        state <math>\gets</math> ExpandKey(state, 0, key)
        state <math>\gets</math> ExpandKey(state, 0, salt)
    return state

Функция InitState соответствует оригинальной функции из шифра Blowfish; для заполнения массива P и S-box используется дробная часть числа <math>\pi</math>.

Функция ExpandKey:

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


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

bcrypt(cost, salt, key, input)
    state <math>\gets</math> EksBlowfishSetup(cost, salt, key)
    ctext <math>\gets</math> input
    repeat (64)
        ctext <math>\gets</math> 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].

См. также

Напишите отзыв о статье "Bcrypt"

Ссылки

  • [www.mindrot.org/projects/jBCrypt/ jBCrypt — реализация bcrypt на Java]
  • [pypi.python.org/pypi/bcrypt/2.0.0 py-bcrypt — реализация bcrypt на Python]
  • [bcrypt.codeplex.com/ BCrypt.Net- реализация bcrypt на C#]
  • [www.jayfuerstenberg.com/blog/bcrypt-in-objective-c JFBCrypt — реализация bcrypt на Objective C]
  • [bcrypt-ruby.rubyforge.org/ bcrypt-ruby — реализация bcrypt на Ruby]
  • [search.cpan.org/perldoc?Crypt::Eksblowfish::Bcrypt Crypt::Eksblowfish::Bcrypt — реализация bcrypt на Perl]
  • [github.com/ncb000gt/node.bcrypt.js/ bcrypt.js — реализация bcrypt на JavaScript]
  • [github.com/fpirsch/twin-bcrypt twin-bcrypt — реализация bcrypt на JavaScript / asm.js]
  • [godoc.org/code.google.com/p/go.crypto/bcrypt bcrypt.go — реализация bcrypt на Go]
  • [tutanota.com/ tutanota.com — пример использования bcrypt в сервисе end-to-end шифрованной почты]

Примечания

  1. Provos, Niels; Mazières, David (1999). «[www.usenix.org/events/usenix99/provos/provos_html/node1.html A Future-Adaptable Password Scheme]». Proceedings of 1999 USENIX Annual Technical Conference: 81–92.
  2. www.openbsd.org/papers/bcrypt-paper.pdf
  3. 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.»
  4. www.unlimitednovelty.com/2012/03/dont-use-bcrypt.html «Unlike bcrypt, PBKDF2 has been the subject of intense research and still remains the best conservative choice.»

Отрывок, характеризующий Bcrypt

Кто то сказал, что капитан Тушин стоит здесь у самой деревни, и что за ним уже послано.
– Да вот вы были, – сказал князь Багратион, обращаясь к князю Андрею.
– Как же, мы вместе немного не съехались, – сказал дежурный штаб офицер, приятно улыбаясь Болконскому.
– Я не имел удовольствия вас видеть, – холодно и отрывисто сказал князь Андрей.
Все молчали. На пороге показался Тушин, робко пробиравшийся из за спин генералов. Обходя генералов в тесной избе, сконфуженный, как и всегда, при виде начальства, Тушин не рассмотрел древка знамени и спотыкнулся на него. Несколько голосов засмеялось.
– Каким образом орудие оставлено? – спросил Багратион, нахмурившись не столько на капитана, сколько на смеявшихся, в числе которых громче всех слышался голос Жеркова.
Тушину теперь только, при виде грозного начальства, во всем ужасе представилась его вина и позор в том, что он, оставшись жив, потерял два орудия. Он так был взволнован, что до сей минуты не успел подумать об этом. Смех офицеров еще больше сбил его с толку. Он стоял перед Багратионом с дрожащею нижнею челюстью и едва проговорил:
– Не знаю… ваше сиятельство… людей не было, ваше сиятельство.
– Вы бы могли из прикрытия взять!
Что прикрытия не было, этого не сказал Тушин, хотя это была сущая правда. Он боялся подвести этим другого начальника и молча, остановившимися глазами, смотрел прямо в лицо Багратиону, как смотрит сбившийся ученик в глаза экзаменатору.
Молчание было довольно продолжительно. Князь Багратион, видимо, не желая быть строгим, не находился, что сказать; остальные не смели вмешаться в разговор. Князь Андрей исподлобья смотрел на Тушина, и пальцы его рук нервически двигались.
– Ваше сиятельство, – прервал князь Андрей молчание своим резким голосом, – вы меня изволили послать к батарее капитана Тушина. Я был там и нашел две трети людей и лошадей перебитыми, два орудия исковерканными, и прикрытия никакого.
Князь Багратион и Тушин одинаково упорно смотрели теперь на сдержанно и взволнованно говорившего Болконского.
– И ежели, ваше сиятельство, позволите мне высказать свое мнение, – продолжал он, – то успехом дня мы обязаны более всего действию этой батареи и геройской стойкости капитана Тушина с его ротой, – сказал князь Андрей и, не ожидая ответа, тотчас же встал и отошел от стола.
Князь Багратион посмотрел на Тушина и, видимо не желая выказать недоверия к резкому суждению Болконского и, вместе с тем, чувствуя себя не в состоянии вполне верить ему, наклонил голову и сказал Тушину, что он может итти. Князь Андрей вышел за ним.
– Вот спасибо: выручил, голубчик, – сказал ему Тушин.
Князь Андрей оглянул Тушина и, ничего не сказав, отошел от него. Князю Андрею было грустно и тяжело. Всё это было так странно, так непохоже на то, чего он надеялся.

«Кто они? Зачем они? Что им нужно? И когда всё это кончится?» думал Ростов, глядя на переменявшиеся перед ним тени. Боль в руке становилась всё мучительнее. Сон клонил непреодолимо, в глазах прыгали красные круги, и впечатление этих голосов и этих лиц и чувство одиночества сливались с чувством боли. Это они, эти солдаты, раненые и нераненые, – это они то и давили, и тяготили, и выворачивали жилы, и жгли мясо в его разломанной руке и плече. Чтобы избавиться от них, он закрыл глаза.
Он забылся на одну минуту, но в этот короткий промежуток забвения он видел во сне бесчисленное количество предметов: он видел свою мать и ее большую белую руку, видел худенькие плечи Сони, глаза и смех Наташи, и Денисова с его голосом и усами, и Телянина, и всю свою историю с Теляниным и Богданычем. Вся эта история была одно и то же, что этот солдат с резким голосом, и эта то вся история и этот то солдат так мучительно, неотступно держали, давили и все в одну сторону тянули его руку. Он пытался устраняться от них, но они не отпускали ни на волос, ни на секунду его плечо. Оно бы не болело, оно было бы здорово, ежели б они не тянули его; но нельзя было избавиться от них.
Он открыл глаза и поглядел вверх. Черный полог ночи на аршин висел над светом углей. В этом свете летали порошинки падавшего снега. Тушин не возвращался, лекарь не приходил. Он был один, только какой то солдатик сидел теперь голый по другую сторону огня и грел свое худое желтое тело.