【问题标题】:PHP app with sensitive data - encrypt/decrypt包含敏感数据的 PHP 应用程序 - 加密/解密
【发布时间】:2018-09-11 18:46:45
【问题描述】:

我在一个项目中,我们需要构建一个应用程序来将敏感信息存储在 mysql 数据库中。我希望在应用程序中重复使用密钥,因为我们需要加密输入的数据并稍后解密以显示信息。

我正在研究libsodium,但我有一个问题......他们建议不要重复使用密钥和nouce,如果我们遵循这个,我们以后将无法解密!

有人可以指导我如何处理这个问题吗?

我们将建立一种方法来擦除/更改可能违反的密钥!

【问题讨论】:

  • 如果您需要继续创建新密钥,您可以存储带有时间戳的旧密钥,并在解密行时,按日期获取相应的密钥。
  • 您在这里提出了很好的问题,但您提出的这类问题表明,如果这是一个涉及必须得到保护。如果是这种情况,我强烈建议您聘请具有经验和认证的顾问来推荐策略。
  • 一个可能对您有用并且不需要太多加密库知识的选项是使用数据库即提供静态透明加密的服务产品。 Amazon 的 Aurora 是一个兼容 MySQL 的选项,加密密钥通过 AWS 密钥管理服务进行管理。 aws.amazon.com/about-aws/whats-new/2015/12/…
  • @tadman 谢谢,但嗯仍然想知道为什么有人不赞成 - _-
  • 因为这个问题太宽泛了,在这里真的跑题了,仅此而已。一个好的问题有代码和我们可以帮助解决的问题。这本质上是一种哲学,我们真的无能为力。

标签: php mysql encryption libsodium sodium


【解决方案1】:

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

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 中选择密码并使用密码验证将其与散列密码匹配。

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

请注意,这仅涵盖最基本的内容。您还需要做其他事情,例如使用 PHP 准备好的语句和转义字符串。为了让你开始,我刚刚谈到了加密。

【讨论】:

  • AES 没有被破坏,还有 bcrypt?我在某处读到,甚至安全顾问都说不要使用 openssl... 数据非常敏感,基本上是为了存储律师流程信息、来自客户的消息等。
猜你喜欢
  • 1970-01-01
  • 2012-12-12
  • 2013-03-24
  • 2012-08-11
  • 2012-07-12
  • 2021-04-10
  • 1970-01-01
  • 2016-10-08
相关资源
最近更新 更多