如何使用php加密和解密mysql数据库中的数据?

时间:2016-03-25 22:01:16

标签: php security encryption cryptography mcrypt

当我将这些东西添加到我的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以外的密钥?

2 个答案:

答案 0 :(得分:5)

  

然后我有两个函数叫做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方案(带有关联数据的Authenticated Encryption)一起是the only way anyone should be encrypting arbitrary data in 2016

您甚至不必特别关注该细节或其他任何细节,但万一您对您的代码段感到好奇:

  • 使用ECB mode
  • 使用Rijndael-256, not AES
  • Libmcrypt使用\0填充消息,直到达到块大小的倍数,因此如果您要加密任何可能以一个或多个\0字节结尾的内容,请准备丢失数据当你解密你的消息时。
  • 此外,rtrim()会吞噬其他字节(\x20最显着)

顺便说一句,所有这些问题一般都得到了回答herehereherehere。已经在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进行编码。