我找到了一个很好的基本密码类,我现在用它来转换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));
}
}
?>
答案 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)作为事实上的字符串列会很浪费。