3 回答
TA贡献1796条经验 获得超7个赞
bcrypt的模块加密格式由以下内容组成
或$2$
,$2a$
标识$2y$
散列算法与格式
- 表示成本参数的两位数值,后面跟着
$
- 53个字符长-64编码值(他们使用字母表)
与.
,/
,0
–9
,A
–Z
,a
–z
标准碱基64编码
(字母表)包括:- 22个字符(实际上只有132位解码比特中的128位)
- 加密输出的31个字符(实际上186位解码比特中只有184位)
因此,总长度分别为59或60字节。
当您使用2a格式时,您将需要60个字节。因此,对于MySQL,我建议使用CHAR(60) BINARY
或BINARY(60)
(见这个垃圾箱和双星校勘有关差异的信息)。
CHAR
不是二进制安全的,等式不是完全依赖于字节值,而是依赖于实际的排序规则;在最坏的情况下。
TA贡献1806条经验 获得超8个赞
如果您正在使用PHP的password_hash()
带着PASSWORD_DEFAULT
生成bcrypt哈希的算法(我假设有很大比例的人阅读这个问题)一定要记住,在将来password_hash()
可能会使用不同的算法作为默认值,因此可能会影响哈希的长度(但不一定更长)。
从手册页:
请注意,随着PHP添加了新的和更强的算法,这个常量被设计成随着时间的推移而改变。因此,使用此标识符的结果的长度会随着时间的推移而改变。因此,建议将结果存储在可扩展超过60个字符的数据库列中。(255个字符将是一个不错的选择)。
使用bcrypt,即使您有10亿用户(即您目前正在与Facebook竞争)存储255字节密码散列,它也只能存储255 GB的数据-相当于一个小型SSD硬盘的大小。存储密码散列不太可能成为应用程序的瓶颈。然而,在偶然的机会中,存储空间真的是由于某种原因,您可以使用PASSWORD_BCRYPT
强迫password_hash()
使用bcrypt,即使这不是默认的。只需确保随时了解在bcrypt中发现的任何漏洞,并在每次发布新PHP版本时检查发布说明。如果默认的算法被改变了,那么最好检查一下。为什么并做出是否使用新算法的明智决定。
添加回答
举报