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

mFe*_*ein 8 mysql hash bcrypt

在MySQL中搜索存储BCrypt哈希的正确方法我发现了这个问题,这只会让我更加困惑.

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

CHAR(60) BINARY or BINARY(60)

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

CHAR(60) CHARACTER SET latin1 COLLATE latin1_bin

甚至:

COLLATE latin1_general_cs

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

Ric*_*mes 7

我的回答是"什么是正确的",而不是"什么会起作用".

不要用latin1.当然,它可能会起作用,但声称加密的字符串是文本而不是它是丑陋的.

说同样的CHAR....

简单地说,BINARY(...)如果固定长度或VARBINARY(...)它的长度可以变化.

但是,有一个问题...你用的是谁?它是否返回二进制数据?还是十六进制字符串?或者甚至可能是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
Run Code Online (Sandbox Code Playgroud)

并明确说明列的charset/collat​​ion,从而覆盖数据库和/或表"defaults".

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