当我把php文件中的一些数据添加到mysql数据库时,我想加密这些数据。
我就是这样做的。
我创建了一个静态密钥,如:
$key = md5("uJHyFVSG");
然后我有两个函数,分别称为encrypt()和decrypt(
function encrypt($string, $key){
$string = rtrim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_ECB)));
return $string;
}
function decrypt($string, $key){
$string = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($string), MCRYPT_MODE_ECB));
return $string;
}
我不确定这是否是最佳实践,但我想知道如何生成除md5之外的密钥?
然后我有两个函数,称为encrypt()和decrypt(()
不要在你的问题中使用代码
事实上,重新访问你发现它的地方,告诉他们他们的代码不安全,他们不应该鼓励人们使用它
我创建了一个静态密钥,如:
$key = md5("uJHyFVSG");
更好的方法是:使用库。
// Generate this once, then save it.
$key = Crypto::createNewRandomKey();
/*
var_dump(Crypto::binToHex($key));
// then later:
$key = Crypto::hexToBin("the generated hex characters go here");
*/
// To encrypt:
$encrypted = Crypto::encrypt(
"This is what you're trying to protect",
$key
);
// To decrypt:
$plaintext = Crypto::decrypt(
$encrypted,
$key
);
上面链接的库(由Taylor Hornby制作)提供了一种称为身份验证加密的东西,它与AEAD方案(关联数据的身份验证加密)一起是2016年任何人加密任意数据的唯一方式。
你甚至不必特别关心这个细节或任何其他细节,但如果你对你的代码片段感到好奇:
- 它使用ECB模式
- 它使用的是Rijndael-256,而不是AES
- Libmcrypt用
'0
填充消息,直到它达到块大小的倍数,所以如果您正在加密任何可能以一个或多个'0
字节结束的内容,请准备在解密消息时丢失数据 - 此外,
rtrim()
将吞噬其他字节(最显著的是'x20
)
顺便说一句,所有这些都在这里、这里、这里和这里得到了普遍的回答。如果你只想搜索的话,Stack Exchange上已经有了大量关于加密最佳实践的信息。
名称中有一条线索:Rijndael 256使用256位密码。您使用的是64位密钥(实际上您只使用48位,但分布在64位)。此外,您可能还想在源代码之外的其他地方存储密钥。
你的系统上有很多随机数生成器,你可以从中选择。但您没有说明它在什么操作系统上运行,也没有说明安装了什么PHP模块。但由于您已经在使用mcrypt,因此可以使用mcrypt_create_iv(256);(提示:如果需要将值存储为ASCII,则使用base64对其进行编码。