【问题标题】:How long is the SHA256 hash?SHA256 哈希有多长?
【发布时间】:2011-01-15 12:09:30
【问题描述】:

我将在密码+盐上运行SHA256,但我不知道在设置 MySQL 数据库时我的VARCHAR 需要多长时间。什么是好的长度?

【问题讨论】:

  • 在阅读本文的任何人决定遵循此建议并使用SHA-* 对密码进行哈希处理之前,PLEASE read this first
  • 除非您在密码上使用 SHA-256(您不应该这样做),否则哈希的长度为 256 位,或 64 个十六进制字符,或 43 个字母数字字符,或 32 个字节。
  • @c00000fd:我不确定该链接是否特别相关。 OP 特别想使用“密码+盐”。例如,如果盐是 16 个随机字符,那么 SHA-256 是否“快速”并不重要,那么字典攻击是不可能的。有关示例代码,请参阅crypt 的 gnu 文档。 SHA-x 适用于密码短语,只要您知道自己在做什么。

标签: mysql sha256


【解决方案1】:

sha256 的长度为 256 位——正如其名称所示。

由于 sha256 返回十六进制表示,4 位足以编码每个字符(而不是 8 位,如 ASCII),因此 256 位将表示 64 个十六进制字符,因此您需要 varchar(64),甚至是 @987654322 @,因为长度总是一样的,根本没有变化。

还有演示:

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

会给你:

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

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

【讨论】:

  • 我们可以使用 char(64) 作为主键还是 binary(32) 会更好? (access_token)
  • 如果您认为您将来可能想要阻止某个用户,那么我建议您使用varchar(65) 作为领先的!...只是说。
  • ...或者只是添加一列 'blocked' ?
  • 因为您想为每个密码使用不同的盐,您必须将其存储在散列旁边。为此,您可以使用额外的字段或将其预先/附加到哈希中,因此您需要超过 64 个字符
  • 你可以使用这个select语句来测试它:SELECT length(to_base64(unhex(sha2('say hello to my little friend',256)))),不管原始字符串的长度是多少,它总是44。
【解决方案2】:

SHA256 的 256 位编码选项:

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

【讨论】:

  • Base64 是每 4 个字符 3 个字节,所以即使 32 个字节适合 43 个字符,您实际上需要 44 个。一个额外的 = 作为最后一个字符添加
  • 好吧,= 可以删除并重新添加。
【解决方案3】:

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

您可以将这 32 个十六进制数字放入 (00 到 FF)。

因此 BINARY(32)!

【讨论】:

  • +1 - 我喜欢优化...对发生在这方面的任何其他人...与 MySQL 一起使用...您可以使用UPDATE...SET hash_column=UNHEX(sha256HexString)。然后,在检索它时,您 SELECT HEX(hash_column) AS hash_column.
【解决方案4】:

为什么要设置为 VARCHAR?它没有变化。它始终是 64 个字符,可以通过在 one of the online SHA-256 calculators 中运行任何内容来确定。

【讨论】:

  • char(64) 是有效的 mysql 语句吗?
  • @hatorade:不,这不是一个语句,但它是一个有效的列类型。
  • varchar 也不会分配空间,除非它被使用,与 char 不同,它分配允许的总字符数,无论是否有数据填充它。
【解决方案5】:

它将固定为 64 个字符,因此请使用 <strong>char(64)</strong>

【讨论】:

  • 并使用CHARACTER SET ascii
猜你喜欢
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 2020-06-26
  • 2010-11-22
  • 2017-08-07
  • 1970-01-01
相关资源
最近更新 更多