将敏感数据安全地存储在数据库中

时间:2012-03-11 08:08:45

标签: php mysql openssl

我目前正在为养老院建立一个网站。 我已经设计了一个将私有数据存储在我的数据库中的方案,但我希望你对此有所了解。

基本上,我有一个表patient,用于存储有关患者的公共(=非敏感)信息。其他一些信息(如姓名,地址)是私人信息,需要安全存储。我使用由PHP OpenSSL生成并由网站管理员发送的公钥/私钥对。只有被允许访问私人数据的人(基本上是医疗保健提供者)才知道密码。 我想把它们存放在另一张桌子里。 第一个问题BLOB是存储二进制数据的最佳列类型(使用MySQL)。或者我应该转换它们(例如base64)并将它们存储在VARCHAR列中吗?

我的patient_secure_data表格如下:

id          INT AUTO_INCREMENT
patient_id  INT (FOREIGN KEY to patient.id)
key         VARCHAR(63)
data        BLOB
env         BLOB

这是一个键值表,其中值由openssl_seal密封。我需要存储第三个参数($env_keys)才能解密数据。那么第二个问题,如果我在拨打openssl_open时拥有私钥的密码,为什么还需要此env_keys

第三个(也是最后一个)问题,它是安全数据库架构吗?我的意思是,我可以保证没有密码短语的人可以看到私人数据吗?

注意:我还将使用相同的密钥对来加密存储在磁盘上的文件。但是数据库或文件,我看不出有关安全性的任何差异。

此致

纪尧姆。

对不起,如果我的语言不完美,我不是母语为英语的人......我希望自己能说清楚。

2 个答案:

答案 0 :(得分:2)

1 - BLOB是我的首选,因为将其编码为base64会增加空间和处理时间(因为在解密之前你还必须解码base64)

2 - openssl_seal没有提供用于加密数据的密钥。 env_keys的目的是存储生成的密钥的加密表单。当您调用openssl_open时,您可以为其提供此信封密钥以及解密信封密钥所需的私钥。私钥需要与用于生成信封密钥的公钥匹配。

3-如果您的私钥需要密码,那么从技术上讲,您的数据相对是安全的。即使他们有信封密钥和私钥,他们也无法使用它......但是你的密码有多安全?有一点需要注意的是,你可以几乎永远不能保证一个完全安全的方案,但你绝对可以让黑客变得强硬。在这里运用你的想象力。顺便说一下,你的代码中的明文密码是什么?

答案 1 :(得分:0)

  1. 超过500个人的任何东西应该是blob(或clob)。

  2. 关于密钥,您只应将公钥存储在公共数据库中。这样您就不必担心任何人(密码或否)能够解密数据。密钥的私有部分应存储在敏感DB中。您只需要公共部分来解密由私有部分加密的数据。我不会将整个密钥(公共+私有)存储在包含非敏感信息的服务器的磁盘上,因为这会损害密钥的安全性。