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

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

编辑

示例哈希:

$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu

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

编辑 2

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

最佳答案

bcrypt 的模块化 crypt 格式包括

  • $2$$2a$$2y$ 标识 hashing algorithm and format
  • 表示成本参数的两位数,后跟 $
  • 一个 53 个字符长的 base-64 编码值(它们使用字母表 ./09, AZ, az 与 standard 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了解更多信息。

https://stackoverflow.com/questions/5881169/

相关文章:

mysql - 如何更改 max_allowed_pa​​cket 大小

mysql - MySQL 中的 utf8mb4 和 utf8 字符集有什么区别?

mysql - 如何设置 MySQL 的时区?

MySQL - 如何按字符串长度选择数据

mysql - 我应该如何解决 MySQL 中的 --secure-file-priv 问题?

mysql - 对于 Homebrew mysql 安装,my.cnf 在哪里?

mysql - 在性能开始下降之前 MySQL 数据库可以有多大

mysql - 错误 2006 (HY000) : MySQL server has gone aw

sql - 从一个表中查找另一个表中不存在的记录

mysql - MySQL VARCHAR 的最大大小是多少?