【问题标题】:Storing sensitive data securely in a database将敏感数据安全地存储在数据库中
【发布时间】:2012-03-28 01:08:36
【问题描述】:

我目前正在为疗养院建立一个网站。 我已经设计了一个方案来在我的数据库中存储私人数据,但我想听听你的意见。

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

我的patient_secure_data 表如下所示:

id INT AUTO_INCREMENT 患者 ID INT(患者 ID 的外键) 键 VARCHAR(63) 数据块 环境 BLOB

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

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

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

问候,

纪尧姆。

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

【问题讨论】:

  • BLOB 比 based64 varchar 更节省空间。
  • key 列是什么类型的键?
  • 表示信息的类型。它可以包含'first_name''last_name''city'...

标签: php mysql openssl


【解决方案1】:

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

2 - openssl_seal 不会为您提供用于加密数据的密钥。 env_keys 的目的是存储生成的密钥的加密形式。当你调用 openssl_open 时,你给它这个信封密钥和它需要 解密 信封密钥的私钥。私钥需要与用于生成信封密钥的公钥匹配。

3- 如果您的私钥需要密码,那么从技术上讲,您的数据相对是安全的。即使他们拥有信封密钥和私钥,他们也无法使用它……但是您的密码有多安全?需要意识到的一件事是,您几乎永远无法保证完全安全的方案,但您绝对可以让黑客难以对付。在这里发挥你的想象力。顺便说一句,您的代码中的密码是明文吗?

【讨论】:

  • 非常感谢您的回答!我的密码不是纯文本。我什至不知道。
【解决方案2】:
  1. 任何超过 500 个字符的内容都应该是一个 blob(或 clob)。

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

【讨论】:

    猜你喜欢
    • 2020-10-27
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2012-03-19
    相关资源
    最近更新 更多