Php MySQL行存储加密的密码
我发现了一个很好的基本密码类,我现在使用它转换MySQL数据库中的所有纯文本密码。目前,包含密码的行是varchar64,但我认为它们应该转换为char128。有人能确认128长度对于该类返回的加密哈希足够长吗 我看到它使用sha256散列密钥,但使用MCRYPT_RIJNDAEL_128,因此我不确定是否需要将长度设置为char128或char256Php 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;
<?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。很高兴知道,谢谢你提供的信息。