【问题标题】:Is openSSL encryption enough?openSSL 加密是否足够?
【发布时间】:2010-11-10 20:49:03
【问题描述】:

我将敏感信息存储在数据库中,该数据库经过以下过程:

  1. 用户通过网络表单输入信息。
  2. 输入的信息使用 AES 256 位加密,并使用每个用户的唯一 ID 进行加盐处理(尽管这存储在相同的数据库中,有时也存储在同一个表中)。
  3. 加密的 pass 1 数据 THEN 通过 openssl_pub_encrypt 函数解析
  4. 数据存储在mysql数据库中,字段类型:varbinary

解密数据:

  1. 私钥存储在服务器之外,每次需要检索数据时都必须上传到临时文件中
  2. 代码通过 o​​penssl_private_decrypt 运行
  3. 代码使用相同的 salt 和 AES-256 脚本通过解密运行。

我想知道的是,在这种情况下,通过 AES-256 位运行信息甚至值得(因为密钥处于脱机状态,并且如果数据被泄露,盐已经存储在表中)?

【问题讨论】:

    标签: php openssl aes mcrypt


    【解决方案1】:

    Salting 对对称加密的数据毫无意义,这就是 AES-256 所拥有的。如果有的话,通过将一些已知的明文放入数据中,它只会使任何潜在的破解者的工作变得更容易。毕竟,任何密钥都会“解密”数据,但只有一个密钥会产生原始数据。通过将一大块已知的明文放入其中,您可以更轻松地确定所使用的密钥是否有效(“那里是否有盐文本,如果密钥有效”)。

    如果数据如此敏感以至于您必须采取这些预防措施,我会更担心密钥文件实际存储在服务器上时的暴露窗口,以及它将在内存中留下的痕迹-disk,即使您删除了文件。

    【讨论】:

    • 对不起,我真的不是在给数据加盐,我使用每个成员的唯一 ID 作为密钥(所以每个人的密钥都不一样)
    【解决方案2】:

    使用与加密数据位于同一位置的密钥对数据进行加密是没有意义的。

    但是,如果您为每个用户使用单独的公钥/私钥对将是一个优势 - 这样,如果私钥泄漏,您只会暴露您的一个记录,而不是所有记录。

    顺便说一句,openssl_public_encrypt() / openssl_private_decrypt() 并不是真正适合使用的函数 - 它是一个用于加密随机生成的密钥的低级函数,而不是直接对数据进行操作。正确的更高级别的函数是openssl_seal() / openssl_open()

    【讨论】:

    • 感谢后一点。关于每个用户的单独公钥/私钥对 - 这似乎不合理,因为我们可能有 10,000 条记录。必须为每条记录生成对,然后存储它们,然后必须为每条记录上传并运行解密,这几乎是不可能的。我确实喜欢你关于“一个而不是全部”的观点,但我不确定在这种情况下这条路线是否可行。
    • @JM4:啊,我从您的描述中假设您在解密时选择了要解密的单个记录,而不是所有记录。一个键应该没问题。
    猜你喜欢
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 2019-04-19
    • 2016-09-27
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多