mysql - 我应该使用什么列类型/长度将 Bcrypt 散列密码存储在数据库中?

标签 mysql hash types storage bcrypt

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

编辑

示例哈希:

$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu

在对一些密码进行哈希处理后,BCrypt 似乎总是生成 60 个字符的哈希值。

编辑 2

抱歉没有提到实现。我正在使用 jBCrypt .

最佳答案

bcrypt 的模块化 crypt 格式包括

  • $2$$2a$$2y$ 标识 hashing algorithm and format
  • 表示成本参数的两位数,后跟 $
  • 一个 53 个字符长的 base-64 编码值(它们使用字母表 ./09, AZ, azstandard Base 64 Encoding 字母表不同)组成的:
    • 22 个盐字符(实际上只有 132 个解码位中的 128 位)
    • 31 个字符的加密输出(实际上只有 186 个解码位中的 184 个位)

因此总长度分别为 59 或 60 个字节。

当您使用 2a 格式时,您需要 60 个字节。因此对于 MySQL,我建议使用 CHAR(60) BINARYor BINARY(60) (有关差异的信息,请参阅 The _bin and binary Collations)。

CHAR 不是二进制安全的,相等性不仅仅取决于字节值,还取决于实际的排序规则;在最坏的情况下,A 被视为等于 a。见 The _bin and binary Collations了解更多信息。

关于mysql - 我应该使用什么列类型/长度将 Bcrypt 散列密码存储在数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5881169/

相关文章:

c# - 无法删除或更新父行: a foreign key constraint fails

PHP/PDO SQLSTATE[42000] : Syntax error or access violation: 1064 Nightmare

java - 变量名与哈希函数有什么关系?

c++ - 为什么运算符的操作数需要是同一类型?

mysql - 如何将超过一百万条记录插入 MySQL 数据库?

android - 如何使用 eclipse 在 android 中获取 linkedIn 帐户的哈希 key ?

c# - SHA256 支持整数吗?

types - gnuplot的Pointtype命令

haskell - 类型级皮亚诺自然数求和的这两种定义之间有什么实际区别吗?

c# - Entity Framework 的原子增量