【发布时间】:2014-07-26 14:31:13
【问题描述】:
我想知道我可以使用这个加密解密脚本进行密码加密并将其放入数据库吗?
什么将是 sql 表密码列结构(当前是 password varchar(32) NOT NULL)。
请注意,此脚本使用 32 字节的十六进制密钥作为加密密钥。
<?php
define('ENCRYPTION_KEY', '32-byte hexadecimal encryption key');
function mc_encrypt($encrypt, $key)
{
$encrypt = serialize($encrypt);
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), MCRYPT_DEV_URANDOM);
$key = pack('H*', $key);
$mac = hash_hmac('sha256', $encrypt, substr(bin2hex($key), -32));
$passcrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $encrypt.$mac, MCRYPT_MODE_CBC, $iv);
$encoded = base64_encode($passcrypt).'|'.base64_encode($iv);
return $encoded;
}
function mc_decrypt($decrypt, $key)
{
$decrypt = explode('|', $decrypt);
$decoded = base64_decode($decrypt[0]);
$iv = base64_decode($decrypt[1]);
if(strlen($iv)!==mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC)){ return false; }
$key = pack('H*', $key);
$decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $decoded, MCRYPT_MODE_CBC, $iv));
$mac = substr($decrypted, -64);
$decrypted = substr($decrypted, 0, -64);
$calcmac = hash_hmac('sha256', $decrypted, substr(bin2hex($key), -32));
if($calcmac!==$mac){ return false; }
$decrypted = unserialize($decrypted);
return $decrypted;
}
?>
【问题讨论】:
-
一些注意事项:如果你只是想验证密码,你不应该存储密码根本,甚至不加密;例如,阅读this。您将在哪里存储加密/解密密钥?其他注意事项:您使用的不是 AES,而是块大小为 256 的 Rijndael。否则加密似乎没问题,即使它使用 MAC-then-encrypt 而不是 encrypt-then-MAC。
-
请注意,密钥处理非常奇怪,似乎您可以给它一个 48 字节的密钥,并让加密密钥具有前 32 个字节,而 HMAC 密钥具有最后 16 个字节。但是如果你在两者之间给它任何东西,键就会重叠。确保您了解密钥处理,否则您以后可能无法解密。
-
@owlstead。谢谢你的回答。你提供的链接真的很有帮助..
-
另请注意,存在一个名为 codereview 的站点。
-
请注意,您应该始终尝试包含语言标签。
标签: php encryption passwords mcrypt