Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL行存储加密的密码_Php_Mysql_Encryption_Mcrypt - Fatal编程技术网

Php MySQL行存储加密的密码

Php MySQL行存储加密的密码,php,mysql,encryption,mcrypt,Php,Mysql,Encryption,Mcrypt,我发现了一个很好的基本密码类,我现在使用它转换MySQL数据库中的所有纯文本密码。目前,包含密码的行是varchar64,但我认为它们应该转换为char128。有人能确认128长度对于该类返回的加密哈希足够长吗 我看到它使用sha256散列密钥,但使用MCRYPT_RIJNDAEL_128,因此我不确定是否需要将长度设置为char128或char256 <?php class Cipher { private $securekey; private $iv_size;

我发现了一个很好的基本密码类,我现在使用它转换MySQL数据库中的所有纯文本密码。目前,包含密码的行是varchar64,但我认为它们应该转换为char128。有人能确认128长度对于该类返回的加密哈希足够长吗

我看到它使用sha256散列密钥,但使用MCRYPT_RIJNDAEL_128,因此我不确定是否需要将长度设置为char128或char256

<?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长度对于该类返回的加密哈希足够长吗

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

目前,包含密码的行是varchar64,但我认为它们应该转换为char128

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

例如:

包含单词butts的VARCHAR255在后端包含6个字节的存储空间

包含单词butts的CHAR128在后端包含128字节的存储。

据我所知,AES-256和RIJNDAEL-128的长度为256位,因此使用char32可能是安全的。检查

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

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

在对密码进行哈希运算之前,应该在密码中添加一个salt。或者使用bcrypt,它会自动加盐

SHA256哈希的长度始终为256位,可以存储在64个字符或32个二进制字节中。看看我对你的回答

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


如果您想在mysql中使用实际的加密算法,请参阅。为您节省了几行PHP代码。我不知道VARCHAR255。很高兴知道,谢谢你提供的信息。