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

0 php security encryption cryptography mcrypt

当我将这些东西添加到我的mysql数据库时,我想加密我的php文件中的一些数据.

我就是这样做的.

我创建一个静态键,如:

$key = md5("uJHyFVSG");
Run Code Online (Sandbox Code Playgroud)

然后我有两个函数,名为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;
}
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是最佳做法,但是我如何生成除md5以外的密钥?

Sco*_*ski 5

然后我有两个函数,名为encrypt()和decrypt()

不要在你的问题中使用代码!

事实上,重新访问你发现它的地方并告诉他们他们的代码是不安全的,他们不应该鼓励人们使用它.

我创建一个静态键,如:

$key = md5("uJHyFVSG");
Run Code Online (Sandbox Code Playgroud)

更好的主意:使用库.

// 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
);
Run Code Online (Sandbox Code Playgroud)

上面链接的库(由Taylor Hornby制作)提供了一种名为Authenticated Encryption的东西,它与AEAD方案(带有关联数据的Authenticated Encryption)一起是2016年任何人应该加密任意数据的唯一方式.

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

  • 它使用ECB模式
  • 它使用的是Rijndael-256,而不是AES
  • Libmcrypt会将消息填充\0到块大小的倍数,因此如果您正在加密任何可能以一个或多个\0字节结尾的内容,请准备在解密消息时丢失数据.
  • 此外,rtrim()将吞噬其他字节(\x20最值得注意的是)

顺便说一下,这里,这里,这里这里已经回答了所有这些问题.如果您只搜索它,那么在Stack Exchange的指尖上已经有大量关于加密最佳实践的信息.