BINARY 类型 MYSQL 字段与 bcrypt

BINARY type MYSQL field with bcrypt

我查看了 this question 关于用于 bcrypt 哈希的字段长度和类型。几个答案提到使用 BINARY MYSQL 列类型。但是,当使用 mysql node.js 模块从该列读取时,它将 BINARY 列读入缓冲区类型而不是字符串。 bcrypt比较函数bcrypt.compare(password, hash, callback)不喜欢缓冲区类型:

Error: data and hash must be strings
    at node_modules/bcrypt/bcrypt.js:150:16

这引出了两个问题:

首先,我假设我想做的是 hash_buffer.toString(),但我注意到 the documentation 中可以使用不同的字符编码。我不确定要使用的正确编码是什么,因为数据并不真正代表实际字符。因为我希望二进制数据保持不变,所以我猜是 ASCII。谁能证实这一点?

其次,我不明白为什么不使用 CHAR 数据类型。散列被专门制作成可打印的字符串。我知道 MYSQL 比较可能不会按预期进行,但无论如何都没有合适的时间来搜索密码哈希或按密码哈希排序。

一般来说,如果 MySQL 进行比较,则使用 BINARY 列存储 bcrypt 哈希值是有意义的。二进制排序规则将防止不需要的比较结果,例如'A'等于'a';这对 Base64 编码有很大的影响。

但是,如果只在应用程序中执行比较,您可以省去麻烦并使用常规的 CHAR 列来存储哈希值。