簡體   English   中英

為什么我不應該在crypt()函數的salt中使用第23個字符?

[英]Why shouldn't I use the 23rd character in a crypt() function's salt?

我正在學習PHP的crypt()函數,並且已經用它運行了一些測試。 根據這篇文章 ,我應該使用長度為22個字符的鹽。 但是,我可以使用長度為23個字符的字符串,但有一些限制。 當我使用22個字符長的字符串時,我總是得到'$ 2y $ xxStringStringStringStri.HashHashHashHashHashHashHashHas'的結果。 我知道這個時期只是鹽的一部分。

似乎如果我使用23個字符而不是22個字符,我可以成功生成不同的哈希值,但所有64個字符只有4種不同的結果。 第23個字符“向下舍入”到64字符字母表中最接近的1/4(例如,第23個字符為“W”並向下舍入為“O”或任何數字向下舍入為“u”)

v---------------v---------------v---------------v---------------
./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890

所有這四個crypt函數都生成相同的salt:

crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAq');
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAr');
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAs');
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAt');

但這個是不同的:

crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAu');

那么為什么我不能使用第23個字符才能成功產生不同的結果呢? 在PHP中是否存在一些應該通過不使用它來避免的錯誤行為?

為了澄清我如何計算鹽中的第23個字符:

crypt('Test123','$2y$08$ABCDEFGHIJKLMNOPQRSTUV');
//        The salt is '$ABCDEFGHIJKLMNOPQRSTUV'
//        Which will be treated as '$ABCDEFGHIJKLMNOPQRSTUO'

它與哈希沖突有關。 一旦超過22個字符,生成的哈希值就不再是唯一的,具體取決於算法的NAMESPACE 換句話說,超過22個字符不會導致任何增加的安全性,實際上可能會降低您的安全級別。

$不是實際鹽的一部分。 它是一個分隔符。

對於Blowfish crypt,格式為$ 2 [axy] $ log2Rounds $ [salt] [hash]。 你描述它添加一個。 - 那是因為你錯過了最后一個角色。 Blowfish的鹽是128位。 你可以只使用126,是的,但你只是不必要地削弱了鹽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM