Bu soru crypt()
. For this question, the first 7 characters of the salt are not counted, so a salt '$2a$07$a
'sadece tuz 1 karakter ve meta-veriler yedi karakter olarak, 1 bir uzunluğa sahip olacağını söyledi PHP'nin uygulanması ile ilgisi yoktur.
, 22 karakterden uzun tuz dizeleri kullanırken, (yani, kesme) oluşturulan karma bir değişiklik olmadığı, 21 karakterden daha kısa dizeleri kullanırken tuz otomatik olarak (karakterler '$
' ile yastıklı olacak görünüşte); Bu oldukça basittir. Bir tuz 20 karakter ve iki 21-boy tuzunun nihai karakter hariç özdeştir bir tuzunun 21 karakter verilmiştir, ancak, her iki karma dize aynı olacaktır. Nihai karakter haricinde 21 uzunluğu tuzuna aynıdır 22 karakter uzunluğunda bir tuz, karma daha farklı olacaktır.
Kod Örnek:
$foo = 'bar';
$salt_xx = '$2a$07$';
$salt_19 = $salt_xx . 'b1b2ee48991281a439d';
$salt_20 = $salt_19 . 'a';
$salt_21 = $salt_20 . '2';
$salt_22 = $salt_21 . 'b';
var_dump(
crypt($foo, $salt_19),
crypt($foo, $salt_20),
crypt($foo, $salt_21),
crypt($foo, $salt_22)
);
Üretecektir:
string(60) "$2a$07$b1b2ee48991281a439d$$.dEUdhUoQXVqUieLTCp0cFVolhFcbuNi"
string(60) "$2a$07$b1b2ee48991281a439da$.UxGYN739wLkV5PGoR1XA4EvNVPjwylG"
string(60) "$2a$07$b1b2ee48991281a439da2.UxGYN739wLkV5PGoR1XA4EvNVPjwylG"
string(60) "$2a$07$b1b2ee48991281a439da2O4AH0.y/AsOuzMpI.f4sBs8E2hQjPUQq"
Neden bu?
EDIT:
Bazı kullanıcılar doğrudur genel dize, bir fark olduğunu belirterek vardır. In salt_20
, ofset (28, 4) olan da$.
, ise salt_21
, ofset (28, 4) olan da2.
; ancak, bu dize karma, tuzu, hem de bir tuzunu oluşturmak için talimatlar (örneğin, $2a$07$
) içeren üretilen dikkat etmek önemlidir fark meydana geldiği kısım hala, aslında, tuzudur. Gerçek karma UxGYN739wLkV5PGoR1XA4EvNVPjwylG
olarak değişmez.
İki tuzlar aynı hash üreten: Dolayısıyla, bu aslında değil üretilen karma bir fark, ama eldeki kesin sorun karma, saklamak için kullanılan tuz bir farktır.
Rembmer: Çıktı aşağıdaki biçimde olacaktır:
"$2a$##$saltsaltsaltsaltsaltsaHASHhashHASHhashHASHhashHASHhash"
// ^ Hash Starts Here, offset 28,32
# # log-baz-2 yineleme sayısını belirleyen nerede algoritması için çalışır
Edit 2:
Yorumlarında, bu kullanıcı benim çıkışını yeniden olamazdı gibi, bazı ek bilgi yayınlamak talep edildi. Aşağıdaki kodu Yürütme:
var_dump(
PHP_VERSION,
PHP_OS,
CRYPT_SALT_LENGTH,
CRYPT_STD_DES,
CRYPT_EXT_DES,
CRYPT_MD5,
CRYPT_BLOWFISH
);
Aşağıdaki çıktıyı üretir:
string(5) "5.3.0"
string(5) "WINNT"
int(60)
int(1)
int(1)
int(1)
int(1)
Umarım bu yardımcı olur.