您不应该加密密码,而是应该使用像bcrypt这样的算法来散列它们。这个答案解释了如何在PHP中正确地实现密码哈希。不过,下面是加密/解密的方法:
$key = 'password to (en/de)crypt';
$string = ' string to be encrypted '; // note the spaces
加密:
$iv = mcrypt_create_iv(
mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
MCRYPT_DEV_URANDOM
);
$encrypted = base64_encode(
$iv .
mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
hash('sha256', $key, true),
$string,
MCRYPT_MODE_CBC,
$iv
)
);
解密:
$data = base64_decode($encrypted);
$iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));
$decrypted = rtrim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
hash('sha256', $key, true),
substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),
MCRYPT_MODE_CBC,
$iv
),
"\0"
);
警告:上面的示例加密信息,但不验证密文以防止篡改。您不应该依赖于未经身份验证的加密来获得安全性,特别是因为所提供的代码很容易受到填充oracle攻击。
参见:
https://stackoverflow.com/a/30189841/2224584
https://stackoverflow.com/a/30166085/2224584
https://stackoverflow.com/a/30159120/2224584
此外,不要只使用“密码”作为加密密钥。加密密钥是随机字符串。
在3v4l.org上演示:
echo 'Encrypted:' . "\n";
var_dump($encrypted); // "m1DSXVlAKJnLm7k3WrVd51omGL/05JJrPluBonO9W+9ohkNuw8rWdJW6NeLNc688="
echo "\n";
echo 'Decrypted:' . "\n";
var_dump($decrypted); // " string to be encrypted "