当我将这些东西添加到我的mysql数据库时,我想加密我的php文件中的一些数据。
我就是这样做的。
我创建了一个静态键,如:
$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以外的密钥?
答案 0 :(得分:5)
然后我有两个函数叫做encrypt()和decrypt()
事实上,重新审视你找到它的地方并告诉他们他们的代码是不安全的,他们不应该鼓励人们使用它。
我创建了一个静态键,如:
$key = md5("uJHyFVSG");
更好的主意:Use a library。
// 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制作)提供了一个名为Authenticated Encryption的东西,它与AEAD方案(带有关联数据的Authenticated Encryption)一起是the only way anyone should be encrypting arbitrary data in 2016。
您甚至不必特别关注该细节或其他任何细节,但万一您对您的代码段感到好奇:
\0
填充消息,直到达到块大小的倍数,因此如果您要加密任何可能以一个或多个\0
字节结尾的内容,请准备丢失数据当你解密你的消息时。rtrim()
会吞噬其他字节(\x20
最显着)顺便说一句,所有这些问题一般都得到了回答here,here,here和here。已经在Stack Exchange上提供了关于加密最佳实践的大量信息,if you would only search for it。
答案 1 :(得分:1)
名称中有一条线索:Rijndael 256使用256位密码。您正在使用64位密钥(实际上您只使用48位,但分布在64位)。此外,您可能需要考虑除源代码之外的其他位置来存储密钥。
您的系统上有许多随机数生成器可供您选择。但是您没有说明运行的操作系统以及安装的PHP模块。但由于你已经使用mcrypt,你可以使用mcrypt_create_iv(256); (提示:如果需要将其存储为ASCII,则对base64进行编码。