繁体   English   中英

MySQL Row存储加密的密码

[英]MySQL Row to store encrypted passwords

我发现了一个很好的基本密码类,现在我可以使用该类来转换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));
    }

}

?>

谁能确认128长度足以满足此类返回的加密哈希的要求?

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

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

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

例如:

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

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

据我所知, AES-256RIJNDAEL-128长256位,因此使用char(32)可能很安全。 (检查从使用Mcrypt在PHP中实现AES的经验教训

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

  • 您不需要加密哈希密码。 哈希不可逆,因此很安全。

  • 您应在对密码进行哈希处理之前为其添加盐。 否则,请使用bcrypt,它会自动添加盐分。

  • SHA256哈希的长度始终为256位,可以存储为64个字符或32个二进制字节。 请参阅我对MySQL的回答:用于哈希密码字段的数据类型和长度是多少?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM