CRYPT_BLOWFISH da tuz uzunligi

PHP qo'llanmasida shunday deyilgan:

CRYPT_BLOWFISH - Blowfish tuz bilan quyidagicha xeshing: "$2a$", ikki xonali xarajat parametri, "$" va "./0-9A-Za-z" alifbosidan 22 ta raqam.

Tuzning uzunligi 22 ekanligini tushundim. Men quyidagi kodni yozdim va tuzning chiqish uzunligi 21 ekanligini payqadim.

$encoded = crypt('pass','$2a$08$QAZXSWEDCVFRTGBNHYUJMK'); // Lenght of Q . . . K is 22
echo $encoded;

Chiqish:

$2a$08$QAZXSWEDCVFRTGBNHYUJM./CR85.t4YytTnmLXsRJMfbYWopbT8Nu

Tuzda K mavjud emas: QAZXSWEDCVFRTGBNHYUJM

Men tushunmaydigan narsa bormi?


person msoa    schedule 31.03.2013    source manba
comment
Siz nima so'rayotganingizga ishonchim komil emas. Nima uchun K tuzda bo'lishi kerak?   -  person Blender    schedule 31.03.2013
comment
K salt qatorida bo'lgani uchun, bu etarli emasmi?   -  person msoa    schedule 31.03.2013


Javoblar (1)


Bu tuzning qanday kodlanganligi bilan bog'liq. Haqiqiy tuz 128 bit, lekin crypt formatidagi kodlangan tuz 22 belgi · 8 bit/belgi · 3/4 = 132 bit. Shunday qilib, kodlangan tuzning 4 biti aslida ishlatilmaydi.

Bu shuni anglatadiki, 16 ta kodlangan tuz mavjud bo'lib, ularning eng kam ahamiyatli belgilarining birinchi to'rt biti bir xil bo'lgan bir xil xeshga olib keladi:

$hashes = array();
$chars = array_merge(array('.','/'), range('A','Z'), range('a','z'), range('0','9'));
foreach ($chars as $char) {
    $salt = 'QAZXSWEDCVFRTGBNHYUJM'.$char;
    $hashes[$salt] = crypt('pass','$2a$08$'.$salt);
}
var_dump($hashes);

Mana bir xil xeshga olib keladigan kodlangan tuzlar:

QAZXSWEDCVFRTGBNHYUJM.
QAZXSWEDCVFRTGBNHYUJM/
QAZXSWEDCVFRTGBNHYUJMA
QAZXSWEDCVFRTGBNHYUJMB
QAZXSWEDCVFRTGBNHYUJMC
QAZXSWEDCVFRTGBNHYUJMD
QAZXSWEDCVFRTGBNHYUJME
QAZXSWEDCVFRTGBNHYUJMF
QAZXSWEDCVFRTGBNHYUJMG
QAZXSWEDCVFRTGBNHYUJMH
QAZXSWEDCVFRTGBNHYUJMI
QAZXSWEDCVFRTGBNHYUJMJ
QAZXSWEDCVFRTGBNHYUJMK
QAZXSWEDCVFRTGBNHYUJML
QAZXSWEDCVFRTGBNHYUJMM
QAZXSWEDCVFRTGBNHYUJMN

crypt, ehtimol, QAZXSWEDCVFRTGBNHYUJM. bo'lgan ichki ishlatiladigan 128 bitli tuzni kodlaydigan birinchisini ishlatadi.

person Gumbo    schedule 31.03.2013
comment
Buni tushunmayapsizmi: 3/4 = 132 bit. bu qanday dozani anglatadi? - person msoa; 31.03.2013
comment
@msoa Base64 uch bayt kirishni to'rt bayt kodlangan chiqish bilan kodlaydi. Va teskari jarayonda to'rt bayt kodlangan kirish uch bayt chiqishga dekodlanadi. Shuning uchun Base64-kodlangan 22 baytlik ma'lumotlar 132 bitli dekodlangan ma'lumotlarga olib keladi. - person Gumbo; 31.03.2013
comment
Osonroq: Har bir Based64 kodlangan belgi 6 bitni oladi. 22*6 = 132 - person msoa; 31.03.2013
comment
Savol qoladi: Base64 indeks jadvalida . belgi yo'q, crypt + yoki / yoki biron bir belgini . ga ichki o'zgartiradimi? Yoki Base64-dekodlash qachon sodir bo'ladi? - person msoa; 31.03.2013
comment
@msoa bcrypt standart Base64 alifbosidan foydalanmaydi, lekin biroz boshqacha: uning tartibi ., /, AZ, az, 09 ga qarama-qarshi AZ, az, 09, +, /. - person Gumbo; 31.03.2013