我在mysql数据库中存储加密信息存在很大问题,引擎mySam
我加密了这样的信息:
function in($plaintext) {
$cipher = 'rijndael-256';
$mode = 'cbc';
$key = 'key';
$td = mcrypt_module_open($cipher, '', $mode, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);
$crypttext = mcrypt_generic($td, $plaintext);
mcrypt_generic_deinit($td);
return $iv.$crypttext;
}
然后将数据存储在blob中。当我对信息进行反复处理时,由于存储在数据库中,大约有10%的时间它已被破坏。
我可以验证数据库是否存在问题,因为我已经运行了脚本来批量加密和解密数据而没有问题。
有什么想法吗?提前谢谢......
[编辑解密例程]
function decrypt($crypttext)
{
$cipher = 'rijndael-256';
$mode = 'cbc';
$key = '$key';
$plaintext = '';
$td = mcrypt_module_open($cipher, '', $mode, '');
$ivsize = mcrypt_enc_get_iv_size($td);
$iv = substr($crypttext, 0, $ivsize);
$crypttext = substr($crypttext, $ivsize);
if ($iv)
{
mcrypt_generic_init($td, $key, $iv);
$plaintext = mdecrypt_generic($td, $crypttext);
}
return $plaintext;
}
答案 0 :(得分:2)
我高度怀疑你遇到过mysql数据库错误......“已损坏”如何?我们能看到你的解密例程和测试脚本吗?你遇到的不只是块大小的填充吗?
填充:crypt algos通常用于数据块(使用128位) - 输入(因而输出!)数据将被填充到此长度,您需要存储整个填充的输出字符串 - 可能还有长度非填充输入,如果你的输入数据是一个无法确定填充的形式。解密后自动删除。
答案 1 :(得分:0)
保护MySQL中的明文密码并不是一个好主意...也为什么不使用SHA1或MD5哈希...你会得到更多的反应,然后根据你的需要改变算法。
基本上
SELECT SHA1(“SecretPassword”)将= 08cd923367890009657eab812753379bdb321eeb或blabityboo
SHA1将存储为40个字符,这意味着您可能应该将数据类型从BLOB更改为varchar,或者nvarchar()< ---可能是varchar ...
如果没有算法的构造,我们无法判断该字段的长度,因此有关填充的说法。
使用SELECT CHARACTER_LENGTH(“SecretPassword”)选择传递时,您将获得加密字段的长度。然后你可以创建适当的约束。
希望这有帮助。