SHA256哈希多长时间?


244

我将SHA256使用密码+ salt 来运行,但是我不知道VARCHAR在设置MySQL数据库时需要花费多长时间。好的长度是多少?


9
在阅读本文的任何人决定遵循此建议并用于SHA-*对密码进行哈希处理之前,请先阅读此内容
c00000fd

2
除非您不应该在密码上使用SHA-256,否则哈希的长度为256位,64个十六进制字符,43个字母数字字符或32个字节。
Caw

Answers:


331

sha256的长度为256位-顾名思义。

由于sha256返回一个十六进制表示形式,所以4位足以编码每个字符(而不是ASCII的8位),因此256位将代表64个十六进制字符,因此您需要a varchar(64)甚至a char(64),因为长度始终相同,完全没有变化。

和演示:

$hash = hash('sha256', 'hello, world!');
var_dump($hash);

会给你 :

$ php temp.php
string(64) "68e656b251e67e8358bef8483ab0d51c6619f3e7a1a9f0e75838d41ff368f728"

即一个包含64个字符的字符串。


7
我们可以使用char(64)作为主键还是二进制(32)更好呢?(access_token)
弗兰克语

3
如果您认为您将来可能希望屏蔽某个用户,那么我建议您使用varchar(65)领先!...只是说说而已。
Manatax 2014年

103
...或只是添加“已阻止”列?
Stijn de Witt 2014年

5
如果您想为每个密码设置不同的盐,则必须将其存储在哈希旁边。为此,您可以使用一个额外的字段或将其预添加/附加到哈希中,因此您将需要超过64个字符
Patrick Cornelissen

4
您可以使用以下select语句对其进行测试:SELECT length(to_base64(unhex(sha2('say hello to my little friend',256)))),无论原始字符串的长度如何,该值始终为44。
DrAhmedJava '17年

72

SHA256的256位的编码选项:

  1. Base64:每个字符6位= CHAR(44)包括填充字符
  2. 十六进制:每个字符4位= CHAR(64)
  3. 二进制:每字节8位= BINARY(32)

30
Base64是每4个字符3个字节,因此即使32个字节适合43个字符,您实际上也需要44个字符
Wilco

2
好了,=可以剥离并重新添加。
里克·詹姆斯

28

我更喜欢使用BINARY(32),因为它是优化的方式!

您可以输入从(00到FF)的32个十六进制数字。

因此BINARY(32)!


8
+1-我喜欢优化...对发生此情况的任何人...与MySQL配合使用...可以使用UPDATE...SET hash_column=UNHEX(sha256HexString)。然后,在检索它时,您SELECT HEX(hash_column) AS hash_column
凯文·尼尔森2014年

22

为什么要将其设为VARCHAR?它没有变化。它始终为64个字符,可以通过将任何内容运行到在线SHA-256计算器之一中来确定。


char(64)是有效的mysql语句吗?
托尼·史塔克

28
@hatorade:不,这不是语句,但是它是有效的列类型。
Mark Byers 2010年

10
varchar除非使用了空间,否则也不会分配空间,与char不同,它会分配允许的总字符数,无论是否有数据填充它。
Xenland

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.