具有敏感数据的PHP应用-加密/解密

时间:2018-09-11 18:46:46

标签: php mysql encryption libsodium sodium

我在一个项目中,我们需要构建一个应用程序以将敏感信息存储在mysql数据库中。我想在应用程序中重用密钥,因为我们需要对输入的数据进行加密,然后再解密以显示信息。

我正在研究libsodium,但我有一个问题...他们建议不要重用密钥并推开,如果我们遵循此规则,我们以后将无法解密!

有人可以指导我如何处理吗?

我们将构建一种方法,以在可能的违规情况下擦除/更改密钥!

1 个答案:

答案 0 :(得分:0)

这确实是一个广泛的问题。这实际上取决于您要保存的信息及其敏感程度。 该链接描述了加密类型和用法。

https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html

一个示例是使用AES_ENCRYPT和AES_DECRYPT。

这是AES_ENCRYPT和AES_DECRYPT MySql函数的快速示例。

  1. 将数据库表设置为二进制类型我使用BLOB。

  2. 第二个创建要使用的密钥。

  3. 插入已加密的数据库。

  4. 从数据库中选择解密的数据。

这将生成一个随机字符串。

function randomString($length) {//This is a function to create a random String.
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$string = '';    
for ($p = 0; $p < $length; $p++) {
$string .= $characters[mt_rand(0, strlen($characters)-1)];}
return $string;}
$ourKey = randimString(16);//get our String in a Varable($ourKey).

在您的插入内容上使用AES_ENCRYPT MySQL函数。

$ourInsert = "INSERT INTO MY_TABLE(FIRST_NAME, OUR_KEY)VALUES(AES_ENCRYPT(FIRST_NAME,'".$ourKey."'), ".$ourKey.")";

使用AES_DECRYPT MySQL函数对其进行解密。

$ourSelect = "SELECT AES_DECRYPT(FIRST_NAME, OUR_KEY) AS FIRST_NAME";

对于密码和更敏感的数据,请使用PHP的password_hash()函数。您的数据库表为此必须至少为75个字符。这是一个更详细说明的链接。

http://www.php.net/manual/en/function.password-hash.php

请注意,您不能解密仅与其他数据匹配的password_hash。

如何使用password_hash对密码进行哈希处理并将其插入数据库的示例。

$hashedPassWord = password_hash(users password, PASSWORD_BCRYPT, array("cost" => 17));
$insertPass = "INSERT INTO MY_TABLE(PASSWORD)VALUES(".$hashedPassWord.")";

并要检查哈希密码,请从db中选择密码,然后使用password verify将其与哈希密码匹配。

if (password_verify(users_input, db_password_hash)) {/*do something*/}

请注意,这仅涵盖了非常基本的内容。您还需要做其他事情,例如使用带有PHP的预备语句和转义字符串。我刚刚谈到了加密方面的知识,以帮助您入门。