在数据库中存储bcrypt哈希密码应该使用什么列类型/长度?

我想将散列密码(使用bcrypt)存储在数据库中。什么样的类型是好的,哪一种是正确的长度?使用bcrypt加密的密码总是长度相同的吗?

编辑

示例散列:

$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu

在散列一些密码后,bcrypt似乎总是生成60个字符哈希。

编辑2

很抱歉没有提到实施。我在用jBCrypt.


斯蒂芬大帝
浏览 1789回答 3
3回答

芜湖不芜

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不是二进制安全的,等式不是完全依赖于字节值,而是依赖于实际的排序规则;在最坏的情况下。

慕森卡

如果您正在使用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版本时检查发布说明。如果默认的算法被改变了,那么最好检查一下。为什么并做出是否使用新算法的明智决定。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MySQL