首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL SHA2函数似乎不起作用

MySQL SHA2函数似乎不起作用
EN

Stack Overflow用户
提问于 2014-03-01 04:04:11
回答 3查看 10.3K关注 0票数 3

我使用的是MySql 5.5.32,并尝试在业务层的存储过程中重现一些代码,这样我就可以为使用sql的用户设置密码。虽然看起来SHA2函数有问题,但我可能遗漏了一些东西:

代码语言:javascript
复制
SELECT length(SHA2("bob", 512))

返回128。不是应该是64吗?

代码语言:javascript
复制
SELECT length(SHA2("bob", 256))

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-02 06:42:35

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

代码语言:javascript
复制
SELECT length(unhex(SHA2("bob", 512)));
票数 6
EN

Stack Overflow用户

发布于 2014-03-02 07:31:32

我对patch for the SHA2() function in 2005进行了编码,并将其贡献给了MySQL (开发人员随后对我的代码进行了一些编辑,以符合他们的编码标准)。

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

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

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

我可以理解读者如何认为这意味着它返回二进制字节,但这是一个误解。

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

如果您不知道我所说的二进制字符集,请参阅What is binary character set?

SHA2()在5.5.6中是changed to use the connection character set,而其他散列函数在5.5.3中以相同的方式进行了更改。

票数 5
EN

Stack Overflow用户

发布于 2014-03-02 07:08:42

SHA2(str, hash_length)函数返回一个非二进制字符串。以前,MySQL中的SHA2函数返回一个二进制字符串的值。

从我提供的链接中的文档:

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

我们可以通过下面的SELECT语句分析所有这些内容:

代码语言:javascript
复制
SELECT SHA2("bob", 256) AS 'Hashed String', 
    UNHEX(SHA2("bob", 256)) AS 'Binary String',
    LENGTH(UNHEX(SHA2("bob", 256))) AS 'Byte Count'

通过MySQL工作台,输出将产生以下结果:

每条评论的更新:

UNHEX(str)函数在文档中声明,它将输入字符串中的每对字符解释为十六进制数字。至于输入字符串是二进制还是非二进制,文档在这里为我们回答了这个问题:

如果UNHEX()的参数是二进制列,则可能出现NULL结果,因为值在存储时会填充0x00字节,但在检索时不会删除这些字节。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22104794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档