在MySQL中搜索存储BCrypt哈希值的正确方法我发现this question它只会让我更加困惑。
接受的答案指出我们应该使用:
CHAR(60) BINARY or BINARY(60)
但是评论中的其他人认为我们应该使用:
CHAR(60) CHARACTER SET latin1 COLLATE latin1_bin
甚至:
COLLATE latin1_general_cs
我不是数据库方面的专家,所以有没有人可以解释我所有这些选项之间的区别,哪一个更适合存储BCrypt哈希?
答案 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 / collation,从而覆盖数据库和/或表"默认值"。
所有Base64字符(和$)都是ascii;不需要更复杂的字符集。使用..._bin
进行整理意味着"准确比较字节&#34 ;;更具体地说,“不要做折叠"”。由于Base64依赖于区分大写和小写字母,因此您不需要进行大小写折叠。