如何使用php对mysql数据库中的数据进行加密和解密?
Posted
技术标签:
【中文标题】如何使用php对mysql数据库中的数据进行加密和解密?【英文标题】:How to encrypt and decrypt data in the mysql database using php? 【发布时间】:2016-07-13 17:30:43 【问题描述】:当我将内容添加到我的 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 以外的密钥?
【问题讨论】:
@Veniamin 这是个糟糕的主意。 【参考方案1】:然后我有两个函数,分别是 encrypt() 和 decrypt()
Don't use the code in your question!
事实上,重新访问你找到它的地方,告诉他们他们的代码不安全,他们不应该鼓励人们使用它。
我创建了一个静态键,例如:
$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 方案(带有关联数据的认证加密)一起是 the only way anyone should be encrypting arbitrary data in 2016。
你甚至不必特别关心那个细节或任何其他细节,但如果你对你的代码 sn-p 感到好奇:
它使用ECB mode 它正在使用Rijndael-256, not AES Libmcrypt 使用\0
填充消息,直到它达到块大小的倍数,因此,如果您正在加密任何可能以一个或多个\0
字节结尾的内容,请准备好在解密消息时丢失数据。
另外,rtrim()
会吞噬其他字节(最明显的是\x20
)
顺便说一句,所有这些问题都得到了一般性的回答 here、here、here 和 here。 Stack Exchange 上已经有大量关于加密最佳实践的信息,if you would only search for it。
【讨论】:
【参考方案2】:名称中有一条线索:Rijndael 256 使用 256 位密码。您正在使用 64 位密钥(实际上您只使用 48 位但分布在 64 位)。此外,您可能还想考虑在源代码之外的其他地方存储密钥。
您的系统上有许多随机数生成器可供您选择。但是你没有说它运行在什么操作系统上,也没有说安装了什么 PHP 模块。但是由于您已经在使用 mcrypt,您可以使用 mcrypt_create_iv(256); (提示:如果需要将值存储为 ASCII,则使用 base64 编码。
【讨论】:
感谢您的评论,openssl_encrypt() 呢mcrytp_create_iv(256)
其实那里只需要32个。
@BenjMikesozery:如果你有 openssl 扩展,那么你可以使用 openssl_random_pseudo_bytes(),而不是 openssl_encrypt() 来创建密钥。以上是关于如何使用php对mysql数据库中的数据进行加密和解密?的主要内容,如果未能解决你的问题,请参考以下文章