Како Девисе чува лозинке за ваше апликације Раилс

Девисе је невероватно решење за потврду идентитета за Раилс са више од 40 милиона преузимања. Међутим, пошто апстрахује већину криптографских операција, није увек лако разумети шта се дешава иза кулиса.

Једна од тих апстракција кулминира постојањем encrypted_passwordдиректне базе података. Тако да сам увек био радознао шта то заправо представља. Ево примера:

$2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO

Али шта значи та бесмислица?

Девисе користи Бцрипт за сигурно складиштење података. На својој веб страници напомиње да користи „ ОпенБСД бцрипт () алгоритам хеширања лозинке, омогућавајући вам лако чување сигурног хеша лозинки ваших корисника “. Али шта је тачно ово хеширање? Како то функционише и како чува сачуване лозинке?

То је оно што желим да вам покажем данас.

Радимо уназад - од сачуваног хеша у вашој бази података до процеса шифровања и дешифровања.

Тај хеш $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yOсе заправо састоји од неколико компоненти:

  • Бцрипт верзија ( 2a) - верзија алгоритма бцрипт () која се користи за производњу овог хеша (чува се након првог $знака)
  • Цост ( 11) - фактор трошкова који се користи за креирање хеша (чува се након другог $знака)
  • Салт ( $2a$11$yMMbLgN9uY6J3LhorfU9iu) - случајни низ који је у комбинацији са вашом лозинком чини јединственом (првих 29 знакова)
  • Контролна сума ( LAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) - стварни хеш-део сачуваног encrypted_password(преостали низ након 29 знакова)

Истражимо последња 3 параметра:

  • Када се користи Девисе, Costвредност поставља променљива класе која се назива стретцх (протеже), а подразумевана вредност је 11. Одређује број хеширања лозинке. ( На свом иницијализатору девисе.рб можете ово конфигурисати на нижу вредност за тестно окружење како би ваш тестни пакет брже радио. ) *
  • Со је случајна низ користи за комбиновање са оригиналним лозинком. То је оно што чини да исте лозинке имају различите вредности када се чувају шифровано. ( Погледајте више о томе зашто је то важно и шта су Раинбов Табле Аттацк с.) **
  • Вредност је заправо генерише хасх лозинке, након што у комбинацији са случајним соли.

Када се корисник региструје у вашој апликацији, мора да постави лозинку. Пре него што се ова лозинка ускладишти у бази података, насумична со се генерише путем БЦрипт :: Енгине.генерате_салт (трошак) узимајући у обзир претходно поменути фактор трошкова. (Напомена: ако pepperје постављена вредност променљиве класе, додаће своју вредност лозинки пре него што је усоли.)

Са том соли (нпр. $2a$11$yMMbLgN9uY6J3LhorfU9iuКоја укључује фактор трошкова) позваће БЦрипт :: Енгине.хасх_сецрет (лозинка, сол) која израчунава коначно хеширање које треба сачувати користећи генерисану сол и лозинку коју је корисник одабрао. Ово коначно хеширање (на пример, $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) ће се заузврат сачувати у encrypted_passwordколони базе података.

Али ако је ово хеширање неповратно и сол се на BCrypt::Password.createпозив насумично генерише BCrypt::Engine.generate_salt(cost), како се може користити за пријављивање корисника?

Ту су корисне те различите хеш компоненте. Након проналаска записа који се подудара са е-поштом коју је корисник доставио за пријаву, шифрована лозинка се преузима и рашчлањује на различите горе наведене компоненте ( Бцрипт верзија , трошак , сол и контролна сума ).

После ове почетне припреме, ево шта се даље дешава:

  1. Дохвати улазну лозинку ( 1234)
  2. Дохвати сол сачуване лозинке ( $2a$11$yMMbLgN9uY6J3LhorfU9iu)
  3. Генеришите хеш из лозинке и соли користећи исту верзију бцрипт и фактор трошкова ( BCrypt::Engine.hash_secret(“1234”, “$2a$11$yMMbLgN9uY6J3LhorfU9iu”))
  4. Проверите да ли је сачувано хеширање исто као израчунато у кораку 3 ( $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO)

И тако Девисе сигурно чува лозинке и штити вас од низа напада, чак и ако је ваша база података угрожена.

Ступите у контакт на Твиттеру @алвесјтиаго и обавестите ме ако вам је овај чланак био занимљив! Хвала вам за читање.

ПС: Ни у ком случају нисам стручњак за безбедност или криптографију, па вас молим да се обратите ако нађете нешто погрешно. Надам се да ће поједностављивањем неких концепата бити лакше разумети шта се догађа.

Хвала @филипепина, @ивобенедито, @јацквеига, @јоао_магс и @педросммореира на рецензијама и сугестијама. Овај чланак је такође доступан на //блог.тиагоалвес.ме/хов-доес-девисе-кееп-иоур-пассвордс-сафе.

Више информација о неким темама.

Фактор трошкова *

  • Опасности од подразумеваног бцрипт фактора трошкова
  • Препоручени број рунди за бцрипт

Раинбов Табле Аттацкс **

  • Дугин сто - Википедиа
  • Шта су дугини столови и како се користе?