[英]Storing sensitive data securely in a database
我目前正在建立疗养院网站。 我已经设计了一种在数据库中存储私有数据的方案,但是我希望您对此有意见。
基本上,我有一个就诊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
)才能解密数据。 所以第二个问题 ,为什么我需要这个env_keys
如果我有当我打电话的私有密钥的密码openssl_open
?
第三个(也是最后一个)问题 ,这是一个安全的数据库架构吗? 我的意思是,我可以保证没有密码的人都不会看到私人数据吗?
注意:我还将使用相同的密钥对来加密磁盘上存储的文件。 但是,数据库或文件在安全性方面看不到任何区别。
问候,
纪尧姆。
抱歉,如果我的语言不完美,我不会说英语。我希望我能说清楚一点。
1-BLOB是我的偏爱,因为将其编码为base64会增加空间和处理时间(因为解密之前您还必须解码base64)
2- openssl_seal
无法为您提供用于加密数据的密钥。 env_keys的目的是存储所生成密钥的加密形式 。 调用openssl_open时,将为其提供此信封密钥以及解密该信封密钥所需的私钥。 私钥需要与用于生成信封密钥的公钥匹配。
3-如果您的私钥需要密码,那么从技术上讲您的数据相对安全。 即使他们具有信封密钥和私钥,也将无法使用它……但是您的密码短语有多安全? 要意识到的一件事是,您几乎永远不能保证一个完全安全的方案,但是您绝对可以使它对黑客很难。 在这里发挥您的想象力。 顺便说一句,您的密码短语是纯文本形式吗?
超过500个字符的任何内容都可能是Blob(或Clob)。
关于密钥,您应该只将公共密钥存储在公共数据库中。 这样,您不必担心任何人(密码短语或否)都可以解密数据。 密钥的私有部分应存储在敏感数据库中。 您只需要公共部分来解密由私有部分加密的数据。 我不会将包含非敏感信息的整个密钥(公用+专用)存储在服务器的磁盘上,因为这会损害密钥的安全性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.