在MySQL上存储BCrypt Hashes的正确方法

时间:2017-03-27 15:25:45

标签: mysql hash bcrypt

在MySQL中搜索存储BCrypt哈希值的正确方法我发现this question它只会让我更加困惑。

接受的答案指出我们应该使用:

CHAR(60) BINARY or BINARY(60)

但是评论中的其他人认为我们应该使用:

CHAR(60) CHARACTER SET latin1 COLLATE latin1_bin

甚至:

COLLATE latin1_general_cs

我不是数据库方面的专家,所以有没有人可以解释我所有这些选项之间的区别,哪一个更适合存储BCrypt哈希?

1 个答案:

答案 0 :(得分:7)

我的回答是"什么是正确的"而不是"什么将起作用"。

请勿使用latin1。当然,它可能有用,但声称加密的字符串是文本而不是它是丑陋的。

同意CHAR...

如果固定长度,则简单地说BINARY(...);如果长度不同,则简单地说VARBINARY(...)

然而,有一个问题......你在使用哪个BCrypt?它是否返回二进制数据?还是十六进制字符串?或者甚至可能是Base64?

我的上述答案假设它返回二进制数据。

如果它返回60个十六进制数字,则将UNHEX(60_hex_digits)存储到BINARY(30)中,以便将其打包更小。

如果是Base64,那么CHARACTER SET ascii COLLATE ascii_bin将是"正确"。 (带有区分大小写的排序规则的latin1也可以。)

如果它是二进制文件,则BINARY(60)是正确的方法。

您提供的链接看起来像Base64,但是它呢?是最多 60个字符?然后我会用

VARCHAR(60) CHARACTER SET ascii COLLATE ascii_bin

明确说明列的charset / collat​​ion,从而覆盖数据库和/或表"默认值"。

所有Base64字符(和$)都是ascii;不需要更复杂的字符集。使用..._bin进行整理意味着"准确比较字节&#34 ;;更具体地说,“不要做折叠"”。由于Base64依赖于区分大写和小写字母,因此您不需要进行大小写折叠。