如何使用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数据库中的数据进行加密和解密?的主要内容,如果未能解决你的问题,请参考以下文章

PHP如何对用户密码进行加密

如何在 PHP 中没有硬编码密钥的情况下进行对称加密

如何使用 PHP 对 MYSQL 中的公司名称进行模糊匹配以自动完成?

MySQL数据加密以及安全维护

MySQL中的密码加密[重复]

如何在php中加密/解密数据?