【问题标题】:Securring stored password保护存储的密码
【发布时间】:2018-03-30 16:31:22
【问题描述】:

实际上我有一个存储客户敏感信息的数据库。 我正在使用类似的东西来加密该数据:

$algo  = 'AES-256-CTR';
$key ='password md5 from bdd'
$iv   = substr(hash('sha256',$email),0,openssl_cipher_iv_length($algo));

$data = base64_encode($data);
$data = openssl_encrypt($data,$algo,$key,OPENSSL_RAW_DATA,$iv);

如您所见,我正在使用客户的电子邮件为密钥创建 iv 和他的密码 md5。 因此,如果有人破解了我的 bdd,他可以解密敏感数据。 有没有更好的办法呢,知道我的php脚本需要能够解密数据才能使用

我的想法:

-使用服务器上的可执行文件创建/修改密码和/或 iv 并进行解密,并且 php 脚本为此调用。

-使用第二个服务器来存储密码并且需要调用 php 脚本进行解密。

【问题讨论】:

  • 如果有人可以访问您的数据库您的源代码(这确实是他们知道如何对“敏感数据”进行逆向工程的唯一方法,对),那么我会说无论如何你都已经骨瘦如柴了。
  • @PatrickQ 这通常是我处理它的方式。如果他们两个都得到了,那就结束了,因为这意味着他们都在服务器上。游戏结束,游戏结束!
  • 您似乎说代码不是“可找到的”?如果是这样,添加第二台服务器来存储密码并进行数据解密应该是有利可图的?
  • 如果有人进入服务器直接获取数据库文件,他们也可以获取网站源代码。但是,如果某人只是获得了数据库的内容(sql 注入攻击、其他数据库漏洞),那么他们不一定有权访问源代码。入侵服务器通常比通过不恰当地使用标准开源代码库等来转储数据库内容更困难。
  • 计数器需要一个随机起始值,键和计数器起始值组合决不能重复使用。当使用密码时,密钥应该由包含迭代的函数(如 PBKDF2)派生而来。简单地使用 MD5 并不安全。

标签: php encryption cryptography


【解决方案1】:

我建议你使用 Argon2 从用户密码中推导出 $key,然后使用对称加密,如 AES,或 XSalsa20 或 XChacha20 对其进行加密,或者你可以使用其他推导函数,使暴力不切实际,请注意salt 永远不会被重复使用,看看? Vaultlibsodium-php

【讨论】:

    【解决方案2】:

    如您所见,我正在使用客户的电子邮件为密钥创建 iv 和他的密码 md5。

    一些你可能需要注意的事情

    • IV 假设对于 CTR 模式是唯一的,但正如已经指出的那样,它是静态的(源自电子邮件)。
    • 在商品硬件上可以在一分钟内找到 md5 冲突(最新的 Tunelling 方法)
    • 您缺少任何身份验证标签。

    加密的常见做法是将随机 IV、加密源和 MAC 作为密文的一部分(例如 iv.encrypted.mac)

    恕我直言,假设您不存储密钥,则从密码 md5 创建密钥可能是可行的,因此没有什么可以发现冲突并且密码具有高熵(长且随机)

    因此,如果有人破解了我的 bdd,他可以解密敏感数据。有没有更好的办法,知道我的php脚本需要能够解密数据才能使用

    这通常是存储系统凭据的问题。您可以使用凭证保险库,但您需要将保险库凭证存储在某处。您可以加密系统凭据,但您需要将解密密钥存储在某处。至少将凭证隐藏起来,以便自动黑客工具或不那么专注的对手更加困难。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 2019-06-06
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多