openSSL加密足够吗?

时间:2010-11-10 20:49:04

标签: php openssl aes mcrypt

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

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

    1. 私钥存储在服务器之外,每次需要检索数据时都必须上传到临时文件中
    2. 代码通过openssl_private_decrypt
    3. 运行
    4. 代码使用相同的salt和AES-256脚本进行解密。
    5. 我想知道的是在这个实例中通过AES-256位运行信息甚至是值得的(因为密钥是脱机的,如果数据受到损害,盐已经存储在表中)?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

使用与加密数据位于同一位置的密钥加密数据毫无意义。

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

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