What column type/length should I use for storing a Bcrypt hashed password in a Database?
我想在数据库中存储哈希密码(使用bcrypt)。哪种类型适合这个,哪种长度合适?密码与bcrypt的哈希值是否总是相同的长度?
编辑
哈希示例:
$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu。
在散列一些密码之后,bcrypt似乎总是生成60个字符的散列。
编辑2
很抱歉没有提到实现。我正在使用jbcrypt。
- Also see Openwall's PHP password Hassing Framework(PPSS).Its manble and hardened against a number of common attacks on user passwords.The Guy who wrote the framework(solardegner)is the same guy who wrote John the Ripper and sits as a judge in the password hasing competition.所以他知道一个想法或两个关于对密码的攻击。
- If anyone falls on this looking for a solution for script:gumbo's answer also applies to script.I personally applied binary(64)in mysql and it allowed me to test for byte equality under Python later on.
bcrypt的模块化密码格式包括
- $2$、$2a$或$2y$标识哈希算法和格式
- 表示成本参数的两位数值,后跟$。
- 一种53个字符长的base-64编码值(它们使用的字母是.、/、0—9、A—Z、A—Z,不同于标准的base 64编码字母),包括:
- 22个字符的salt(实际上只有132个解码位中的128位)
- 31个字符的加密输出(实际上186位解码中只有184位)
因此,总长度分别为59或60字节。
使用2a格式时,需要60个字节。因此,对于MySQL,我建议使用CHAR(60) BINARY或BINARY(60)(有关差异的信息,请参阅二进制和二进制排序)。
CHAR不是二进制安全的,相等不仅取决于字节值,而且取决于实际的排序规则;在最坏的情况下,A被视为等同于A。有关更多信息,请参阅_bin和binary整理。
- 被感知为储存BINARY(60)造成unexpected平等行为的字符串(在其他的东西)。在这.net可以不对称使用string.equals市(fromdatabasebinary60string,typicalishstring,stringcomparison.invariantculture)
- 如果你定义的列为char(60)collate latin1 latin1字符集_仓,你现在把字符串精确比较优势的大学没有needing BINARY A柱。
- 关于CHAR比较,只是在使用COLLATE SQL_Latin1_General_CP1_CS_AS查询规范或柱
- "andrefigueiredo SQL_Latin1_General_CP1_CS_AS冰在未知的MySQL。什么是已知的latin1_general_cs冰。
- 我的爱在这里有一个定义了2,2a鸭均2y哈希算法和格式。在不能把IP是由一些简单的搜索答案。
- "我不清楚我们要大CHARAA,二元冰槽或binary(60)安全,有unexpected行为…………………
- @案例jocull离你不找。这是一个很好的解释的算法:en.wikipedia.org /审计/ bcrypt # Wiki的历史版本_
- 我不把理由为什么我应该呢?BINARY二进制或不全,如果不想让两个黑城的密码哈希散列,compare在线数据库层结构柱或独特的密码("对不起,这个密码在使用冰。")所有。使用的recommend utf8盛开。在那情况会有什么问题,会有吗?
- "冰"的霓虹灯的问题,你可能会有两个不同的散列compare平等。如果你没有,这specify BINARY的A柱(a VARCHAR或与右collation),你不运行的风险,在其他的,改变一些设置,使得它compare钝感的一个实例。它也让你的意图更清晰,这是一个很普遍的事情。你的储存BINARY数据;你应该大信息为二进制数据。
bcrypt散列可以存储在BINARY(40)列中。
如其他答案所示,BINARY(60)是最简单和最自然的选择,但如果您想最大限度地提高存储效率,可以通过无损地解构散列来节省20个字节。我在Github上更详细地记录了这一点:https://github.com/ademarre/binary-mcf
Bcrypt哈希遵循一种称为模块化密码格式(MCF)的结构。二进制MCF(BMCF)将这些文本哈希表示解码为更紧凑的二进制结构。对于bcrypt,生成的二进制散列为40个字节。
Gumbo很好地解释了BCrypt MCF哈希的四个组成部分:
1
| $<id>$<cost>$<salt><digest> |
对BMCF的解码如下:
$$可以用3位表示。
$04-31可以用5位表示。把这些放在一起1个字节。
22个字符的salt是128位的(非标准)base-64表示。Base-64解码产生16个字节。
31个字符的哈希摘要可以是base-64,解码为23个字节。
总共40个字节:1 + 16 + 23。
您可以在上面的链接中阅读更多内容,或者在Github上检查我的PHP实现。
- 成本的概念:20小时的现场平衡的一百万字节+记录:20MB,一旦你达到一百万记录+。improperly实施成本的一场shortened长度,在一个高度复杂的安全与工程现场:美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元美元你做数学。
- kzqai样",我说,"larger 60字节的柱是最自然的选择,但我aggressively pursue冰储能效率的两个项目的依赖。例如,它的两个普通试图安装的全部数据库的存储,和20和20 MB这里有另一个可以添加IP很快在一个存储器约束的环境。
- 你以为我的RSS源点。——如果你想把你的数据库到另一存储器OPTIMIZE柱过柱的接触式bcrypt存储。——如果你拥有的每一个其他的改进柱两自由度和疯狂,只有bcrypt哈希是左柱,得到另一个大的记忆只是bcrypt。——如果你做了两个以上的……拉,你没有其他改进每一柱部低挂水果,你会得到两个测试和一个混乱的加密,安全系统工程,and replace它用一个更复杂的家庭成长的系统有一个机会,实施失效。
- "kzqai有无风险的安全weakening bcrypt图书馆,你在这里。这是一undone编码得到的数据,从存储在检索到密码的支票。这是不是"不要滚你自己的密码"的领地。
- 很好的解释。虽然你的解释):一个伟大的礼物的想法,我只是想去与60 chars,甚至100 chars,完全是在安全方面。好的辩论和kzqai鸭"。
如果您使用php的password_hash()和PASSWORD_DEFAULT算法生成bcrypt哈希(我假设这是阅读此问题的大部分人),请务必记住,在未来password_hash()可能使用不同的算法作为默认算法,这可能会影响哈希的长度(但可能不一定更长)。
从手册页面:
Note that this constant is designed to change over time as new and
stronger algorithms are added to PHP. For that reason, the length of
the result from using this identifier can change over time. Therefore,
it is recommended to store the result in a database column that can
expand beyond 60 characters (255 characters would be a good choice).
号
使用bcrypt,即使你有10亿用户(即你目前正在与Facebook竞争)来存储255字节的密码散列,它也只能存储约255GB的数据,大约相当于一个小型的SSD硬盘大小。存储密码哈希不太可能成为应用程序的瓶颈。然而,由于某些原因,存储空间确实存在问题,您可以使用PASSWORD_BCRYPT强制password_hash()使用bcrypt,即使这不是默认值。只要确保随时了解bcrypt中发现的任何漏洞,并在每次发布新的PHP版本时查看发行说明。如果默认算法曾经被更改过,那么最好检查原因并做出是否使用新算法的明智决定。
我不认为您可以像使用MD5散列那样,使用任何巧妙的技巧来存储它。
我认为你最好的办法是把它作为一个CHAR(60)存储起来,因为它总是有60个字符长
- 尽管《PHP文件,票据的使用应该能够保持更多的数据,本稿。
- 没有理由两片板。如果你是用软件requires六十个字节,那么allocate六十个字节。如果有一个释放你的未来,改变了这个软件,你可以担心,释的时候发生的。你不应该被自动更新installing -功能性改变。