Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hash flask_bcrypt不允许使用'\x00和x27;在中间_Hash_Bcrypt_Password Encryption_Password Hash - Fatal编程技术网

Hash flask_bcrypt不允许使用'\x00和x27;在中间

Hash flask_bcrypt不允许使用'\x00和x27;在中间,hash,bcrypt,password-encryption,password-hash,Hash,Bcrypt,Password Encryption,Password Hash,我有一些代码接受字符串格式的密码,并在将其传递给flask_bcrypt进行哈希之前使用SHA3-512对其进行哈希。然而,通过一些巧合,我发现了一个测试用例,它在哈希结果中间产生一个包含\x00’的散列,如下所示: password_str = 'tes15!tes15!tes15!tes15!tes15!tes15!tes15!tes15!tes15!tes15!tes15!tes15!.' password_bytes = password_str.encode('utf-8') hash

我有一些代码接受字符串格式的密码,并在将其传递给flask_bcrypt进行哈希之前使用SHA3-512对其进行哈希。然而,通过一些巧合,我发现了一个测试用例,它在哈希结果中间产生一个包含\x00’的散列,如下所示:

password_str = 'tes15!tes15!tes15!tes15!tes15!tes15!tes15!tes15!tes15!tes15!tes15!tes15!.'
password_bytes = password_str.encode('utf-8')
hashed = hashlib.sha3_512(password_bytes).digest()
散列的结果是:

b'u~"\x98\xac\xc8E2eV\xbb\x8e#}\x92R\xdc\xa2\xab\xab\xcb\x8d.~\x9f\x82a\xbf\xec]k\xdb\xc55\x1d\xa4\x00\xe8\x03\x94\xb0\x91\x14\xf0\x9ec\x9a\x9ay\xfeP\xe3\x07J\x00\xb5\xbd\xba\xcb(\xf5\xdb\xab\x1a'

正如我们所看到的,哈希中间有一个'\x00 ',但在结尾没有。flask_bcrypt检测到此ValueError异常:

if b"\x00" in password:
    raise ValueError("password may not contain NUL bytes")
<>我知道,'x00 '是一个保留字符,可能是由于哈希长度扩展攻击而产生的攻击向量。但是,我不认为我做了任何不寻常的事情。在将散列传递给我丢失的bcrypt或flask_bcrypt之前,是否有一种最佳做法来清理散列,或者是否有另一种应与密码一起使用的字节编码


如果仅仅因为普通密码的派生哈希与所使用的身份验证库冲突而拒绝它,那就太奇怪了。。非常感谢您的帮助或建议。谢谢大家!

BCrypt是为散列用户密码而设计的,这与SHA不同,SHA是为了像文件一样散列二进制输入。用户输入的密码实际上从不包含\0字符,毕竟是用户决定使用自己的密码,而不是黑客试图利用安全漏洞

换句话说,您应该直接以字符串形式传入密码,并避免将其转换为二进制值的UTF-8编码