Bcrypt在PHP中被破坏了吗?可以轻松包含任何恶意负载

Bcrypt在PHP中被破坏了吗?可以轻松包含任何恶意负载,php,security,encryption,bcrypt,collision,Php,Security,Encryption,Bcrypt,Collision,盐:可以是任何东西。 工作因素:可以是任何东西。 以下所有操作都会生成相同的哈希 $pad = base64_decode('/gB='); $data = array( 'LegitimatePayload', 'LaterSwitchedToMaliciousPayload', 'Abracadabra', 'hatIsGoingOn', 'CanBeAlmostAnything', ); foreach($data as $str){ ec

盐:可以是任何东西。
工作因素:可以是任何东西。
以下所有操作都会生成相同的哈希

$pad = base64_decode('/gB=');
$data = array(
    'LegitimatePayload',
    'LaterSwitchedToMaliciousPayload',
    'Abracadabra',
    'hatIsGoingOn',
    'CanBeAlmostAnything',
);

foreach($data as $str){
    echo crypt($pad.$str, '$2a$04$AnySaltHere')."<br>\n";
}
编辑:
这是一个前两个字节相同但哈希不同的字符串:
base64_解码('/gBQyoK71jVY/J7QuBNJuFdxyf2eTBCs42chkx6ZvpJYszpzg===')

如果php在第一个NUL字节停止,那么您如何解释这一点?

您没有提供任何有效的base64编码字符串,因此base64_decode可能只会为所有测试用例返回false,因此它将对它们进行同样的加密。你为什么要使用base64_解码?

你可能想要
base64_编码
,而不是
base64_解码
。它返回相同的结果是因为结果总是假的。

所有字符串都有一个前缀,当运行
base64\u decode
时,该前缀将导致一个
0xfe
字符和一个
0x00
字符,并在0x00后面加上额外的可变字符。由于标准crypt将在
0x00
字符处停止,因此所有crypt调用仅加密
0xfe
字符

您只需拨打电话即可验证

echo crypt("\376", '$2a$04$AnySaltHere')."<br>\n";

事实上,尽管前缀相同,但将完全加密到其他内容。这是因为该字符串实际上是无效的base64,并且base64_解码返回false。这将导致字符串加密为与空字符串相同的哈希。

您的意思是
base64\u encode
?或者您发现了其他人从未发现过的错误,或者是您的代码。提示,这是第二个。我也不认为在这里插入恶意负载有什么意义
crypt
不是为完整性检查而设计的。它是为密码哈希而设计的。因此,即使它以您声称的方式被破坏,唯一的后果是:不要选择以这些字符开头的密码。有些语言使用二进制安全字符串。众所周知,大多数php函数都不是二进制安全的,对于包含
\0
的字符串,它会中断。所以,除非你证明问题不仅仅是php在第一个
\0
字符处停止,否则否决票是值得的,我真的不知道为什么这个问题会有这么多否决票+1.不返回false,我已经检查过了。返回不同的字符串。为清晰起见编辑了问题。为了表明它适用于二进制数据,我为清晰起见编辑了代码。你没有抓住要点:你提供的字符串不是base64编码的,因此base64_decode将始终返回false。没有漏洞,只是你的代码没有任何意义。我向你保证,它们不会返回false。我已经通过将输出写入文件并通过十六进制编辑器查看来验证了这一点。密码不会在NUL字符处停止,我的字符串的开头与上面相同,但会产生不同的哈希值。+1这是正确的答案<代码>\0字节是PHP链接到低级函数中的一个PITA,甚至是一个安全问题。问题是PHP将字符串内容和长度作为单独的内容,而典型的libc调用则使用零结尾字符串($i=0;$iI不久前在@Roman上对此安全问题发表了评论,该字符串(以3个等号结尾)实际上是无效的base64,因此base64_decode返回false。它将加密为与空字符串完全相同的哈希,请尝试
echo crypt(“,“$2a$04$AnySaltHere”)。“
\n”
echo crypt("\376", '$2a$04$AnySaltHere')."<br>\n";
"/gBQyoK71jVY/J7QuBNJuFdxyf2eTBCs42chkx6ZvpJYszpzg==="