我正在使用MySql 5.5.32并尝试在业务层中的存储过程中重现某些代码,因此我可以使用sql
为人们设置密码。看来SHA2功能有问题,但也许我错过了一些东西:
SELECT length(SHA2("bob", 512))
返回128.不应该是64吗?
SELECT length(SHA2("bob", 256))
返回64,所以看起来我丢失了一些东西,或者SHA2中有一个错误。有什么想法吗?
答案 0 :(得分:4)
评论是正确的,即使文档说它返回二进制字符串,它返回十六进制编码的字符串。要获得正确的长度,请使用:
SELECT length(unhex(SHA2("bob", 512)));
答案 1 :(得分:4)
SHA2(str, hash_length)函数返回非二进制字符串。 以前 MySQL中的SHA2
函数返回了二进制字符串的值。
从我提供的链接中的文档:
从MySQL 5.5.6开始,返回值是一个非二进制字符串 连接字符集。
我们可以通过以下SELECT
声明剖析所有这些:
SELECT SHA2("bob", 256) AS 'Hashed String',
UNHEX(SHA2("bob", 256)) AS 'Binary String',
LENGTH(UNHEX(SHA2("bob", 256))) AS 'Byte Count'
通过 MySQL Workbench 输出将产生以下结果:
每条评论更新:
UNHEX(str)函数在文档中声明它将输入字符串中的每对字符解释为十六进制数字。至于输入字符串是二进制还是非二进制,文档在这里为我们回答了这个问题:
如果UNHEX()的参数是BINARY列,则会出现NULL结果,因为在存储时会使用0x00字节填充值,但这些字节在检索时不会被剥离。
答案 2 :(得分:4)
我编写了patch for the SHA2() function in 2005并将其贡献给MySQL(开发人员随后编辑了我的代码以符合他们的编码标准)。
该函数总是返回一个十六进制数字字符串,就像MySQL中的所有其他哈希函数一样。
您可能正在阅读文档中的这句话:
从MySQL 5.5.6开始,返回值是连接字符集中的非二进制字符串。在5.5.6之前,返回值是二进制字符串。
我可以看到读者如何认为这意味着它返回二进制字节,但这是一种误解。
这实际上意味着该字符串具有二进制字符集。它仍然是十六进制数字的明文字符串。事实上,MySQL中没有任何哈希函数返回一个字节字符串,就像你在它上面运行UNHEX()一样,它们都返回十六进制数字的字符串。十六进制数字字符串的长度是等效二进制字节长度的两倍。
如果您不知道我的意思是二进制字符集,请参阅What is binary character set?
在5.5.6中,SHA2()为changed to use the connection character set,而其他散列函数在5.5.3中的更改方式相同。