如何使用php对mysql数据库中的数据进行加密和解密


How to encrypt and decrypt data in the mysql database using php?

当我把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对其进行编码。