【问题标题】:MySQL Row to store encrypted passwordsMySQL Row 存储加密密码
【发布时间】:2014-06-23 10:08:20
【问题描述】:

我找到了一个很好的基本密码类,我现在用它来转换我的 MySQL 数据库中的所有纯文本密码。目前包含密码的行是 varchar(64),但我相信它们应该转换为 char(128)。任何人都可以确认 128 长度对于此类返回的加密哈希是否足够长?

我看到它使用 sha256 对密钥进行哈希处理,但使用 MCRYPT_RIJNDAEL_128,所以我不确定是否需要将长度设为 char(128) 或 char(256)

<?php

class Cipher
{

    private $securekey;
    private $iv_size;

    function __construct($textkey)
    {
        $this->iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
        $this->securekey = hash('sha256', $textkey, TRUE);
    }

    function encrypt($input)
    {
        $iv = mcrypt_create_iv($this->iv_size);
        return base64_encode($iv . mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->securekey, $input, MCRYPT_MODE_CBC, $iv));
    }

    function decrypt($input)
    {
        $input = base64_decode($input);
        $iv = substr($input, 0, $this->iv_size);
        $cipher = substr($input, $this->iv_size);
        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->securekey, $cipher, MCRYPT_MODE_CBC, $iv));
    }

}

?>

【问题讨论】:

  • 如果要在mysql中使用实际的加密算法,请参考this link。为您节省几行 PHP 代码。

标签: php mysql encryption mcrypt


【解决方案1】:

任何人都可以确认 128 长度对于此类返回的加密哈希是否足够长?

也许?运行一些测试。查看文档。

目前包含密码的行是 varchar(64),但我认为应该将它们转换为 char(128)。

保持为VARCHAR,将长度改为255。VARCHARS作为字符串存储在后端,加上一两个字节表示长度。 1 到 255 一个字节,256-65535 两个字节。

例如:

包含单词“butts”的VARCHAR(255) 在后端包含 6 个字节的存储空间。

包含单词“butts”的CHAR(128) 在后端包含 128 个字节的存储空间。

【讨论】:

  • 我不知道 VARCHAR(255)。很高兴知道,感谢您提供的信息。
【解决方案2】:

据我所知,AES-256RIJNDAEL-128 的长度为 256 位,因此使用 char(32) 可能是安全的。 (查看Lessons learned implementing AES in PHP using Mcrypt

无论如何,如果您不确定,您始终可以使用 VARCHAR(256)。它的动态分配将确保您的安全,并且 CHAR 与 VARCHAR 的性能不会对您产生太大影响。

【讨论】:

    【解决方案3】:
    • 您不需要加密散列密码。散列不可逆,因此很安全。

    • 在散列密码之前,您应该在密码中添加盐。或者使用 bcrypt,它会自动加盐。

    • SHA256 哈希的长度始终为 256 位,可以存储为 64 个字符或 32 个二进制字节。查看我对MySQL: what data type to use for hashed password field and what length?的回复

    • 其他人建议使用 VARCHAR(255),因为它只存储给定字符串所需的字符。这对于存储在数据行和索引中是正确的,但是当这些字符串从 MySQL 存储引擎中复制出来并带入 MySQL 的 SQL 结果集中时,它们会临时填充到完整的字符串长度。所以使用 VARCHAR(255) 作为事实上的字符串列是很浪费的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-18
      • 2012-12-10
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 2018-07-28
      • 2012-04-07
      相关资源
      最近更新 更多