Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL SHA2函数似乎不起作用_Mysql_Sha2 - Fatal编程技术网

MySQL SHA2函数似乎不起作用

MySQL SHA2函数似乎不起作用,mysql,sha2,Mysql,Sha2,我正在使用MySql 5.5.32,并试图在业务层的存储过程中复制一些代码,以便我可以为使用sql的人设置密码。虽然SHA2函数似乎有问题,但可能我遗漏了一些东西: SELECT length(SHA2("bob", 512)) 返回128。不应该是64岁吗 SELECT length(SHA2("bob", 256)) 它返回64,所以看起来要么我遗漏了什么,要么SHA2中有一个bug。有什么想法吗?注释是正确的,尽管文档说它返回二进制字符串,但它返回十六进制编码的字符串。要获得正确的长度

我正在使用MySql 5.5.32,并试图在业务层的存储过程中复制一些代码,以便我可以为使用
sql
的人设置密码。虽然SHA2函数似乎有问题,但可能我遗漏了一些东西:

SELECT length(SHA2("bob", 512))
返回128。不应该是64岁吗

SELECT length(SHA2("bob", 256))

它返回64,所以看起来要么我遗漏了什么,要么SHA2中有一个bug。有什么想法吗?

注释是正确的,尽管文档说它返回二进制字符串,但它返回十六进制编码的字符串。要获得正确的长度,请使用:

SELECT length(unhex(SHA2("bob", 512)));
函数返回一个非二进制字符串。之前,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()的参数是二进制列,则可能会出现空结果,因为存储时会用0x00字节填充值,但检索时不会剥离这些字节

我对代码进行了编码,并将其提交给MySQL(然后开发人员对我的代码进行了一些编辑,以符合他们的编码标准)

该函数总是返回一个十六进制数字字符串,就像MySQL中的所有其他哈希函数一样

您可能正在阅读文档中的以下语句:

从MySQL 5.5.6开始,返回值是连接字符集中的非二进制字符串。在5.5.6之前,返回值是二进制字符串

我知道读者会怎么想,这意味着它返回二进制字节,但这是一种误解

实际上这意味着字符串有一个二进制字符集。它仍然是一个十六进制数字的纯文本字符串。事实上,MySQL中的哈希函数都不会返回字节字符串,就像对其运行UNHEX()一样,它们都会返回十六进制数字字符串。十六进制数字字符串的长度是等效二进制字节长度的两倍

如果您不知道我指的是二进制字符集,请参阅


SHA2()在5.5.6中有更改,而其他哈希函数在5.5.3中也有更改。

长度以位为单位指定,返回的字符串以十六进制编码。又名4位=1个字符,所以512/4=128,256/4=64。是的,文档应该更清晰。我理解他们所说的“二进制字符集”是什么意思,但我仍然认为他们的意思是它实际上是散列函数的字节,即某种二进制blob。文档应该声明:SHA2以十六进制编码字符串的形式返回哈希值,表示哈希值。从MySQL 5.5.6开始,返回值是连接字符集中的非二进制字符串。在5.5.6之前,返回值是一个二进制字符串。请随意在bugs.mysql.com.BTW提交一份文档错误报告,SHA2没有做任何加密,它是散列。此外,文件中关于5.5.6之前版本的评论与该问题无关。您提供的示例将在两个版本中返回相同的值。文档甚至没有说明unhex希望作为参数的字符串类型。UNHEX是采用二进制字符串还是非二进制字符串?文档没有说。是的,哈希=/=加密。坏习惯。我更新了我的答案,以解决您上次对
UNHEX
参数的担忧。