MySQL Row用于存储加密密码

时间:2014-05-06 17:04:09

标签: php mysql encryption mcrypt

我找到了一个很好的基本密码类,我现在用它来转换MySQL数据库中的所有纯文本密码。目前包含密码的行是varchar(64),但我相信它们应该转换为char(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));
    }

}

?>

3 个答案:

答案 0 :(得分:0)

  

任何人都可以确认这个类返回的加密哈希长度足够长吗?

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

  

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

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

例如:

VARCHAR(255)包含单词&#34; butts&#34;在后端包含6个字节的存储空间。

CHAR(128)包含单词&#34; butts&#34;在后端包含128个字节的存储空间。

答案 1 :(得分:0)

据我所知 AES-256 RIJNDAEL-128 是256位长,所以你可能对char(32)安全。 (查看Lessons learned implementing AES in PHP using Mcrypt

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

答案 2 :(得分:0)

  • 您不需要加密哈希密码。哈希是不可逆的,所以它是安全的。

  • 您应该在对密码进行哈希处理之前为密码添加一个salt。或者使用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)作为事实上的字符串列会很浪费。