2

我正在构建一个需要 HIPAA 合规性的应用程序,切入正题,这意味着我不能允许在数据库中自由查看某些连接(患者和对他们的建议)。

这些表通过patients_recommendations我的应用程序中的表连接,在我通过attr_encrypted添加加密之前效果很好。为了减少加密和解密的数量(以及相关的开销),我希望能够简单地加密表patient_id中的patients_recommendations数据。但是,在将数据类型更改为string并将列名更改为encrypted_patient_id时,当我尝试重新设置数据库时,应用程序会中断并出现以下错误:

无法写入未知属性“患者 ID”

我认为这是因为连接是直接查找列而不是通过模型(有道理,使用模型可能更慢)。有什么方法可以让 Rails 通过模型(在哪里attr_encrypted添加了必要的辅助方法)?

更新:

为了找到解决方法,我尝试向模型添加 before_save ,如下所示:

before_save :encrypt_patient_id

...

private

def encrypt_patient_id
  self.encrypted_patient_id = PatientRecommendation.encrypt(:patient_id, self.patient_id)
  self.patient_id = nil
end

但是,这也不起作用,导致相同的错误unknown attribute。两种解决方案都对我有用(尽管第一个解决方案可以解决主要问题),有什么想法为什么before_save在通过关联创建时没有被调用?

4

2 回答 2

1

您可能应该将 PII 数据和 PHI 数据存储在单独的数据库中。加密 PII 数据(包括与提供者或提供者位置的任何关联),然后散列所有 PHI 数据以使其更容易。只要两者之间没有直接关联,不加密 PHI 数据是可以接受的,因为它是匿名的。

于 2014-01-23T20:09:33.233 回答
0

A计划

不要设置patient_id,因为它不存在并且问题可能会消失nilencrypt_patient_id

此外,以nilor结束回调false将停止回调链,true在方法的末尾放置一个显式。

B计划,重新考虑你的选择

还有更多选择——从数据库级别的透明加密(正式加密磁盘上的数据)到用于存储某些表空间的加密文件系统,再到对列中的数据进行平面加密。

由于各种原因,从报告问题到性能问题,当需要加入时,加密连接列听起来像是一条不愉快的道路,这可能非常严重,

您当前遇到的种子问题看起来像是由此造成的第一次颠簸,这可能是一条糟糕的道路(在这种情况下,activerecord 似乎对如何处理您的关联感到困惑,它尝试设置patient_id初始化并中断)。

加密受限数据的开销可能没有您想象的那么高,不确定 HIPAA 的情况如何,但对于 PCI,您并不完全鼓励您在屏幕上呈现受保护的数据,因此加密只会产生很小的开销,因为它很少发生(业务需要知道等)。

此外,内存可能被认为是“不是静止的,也不是在传输中”,理论上你可以在有限的时间内缓存一些明确的值,从而节省解密开销。

基本上,加密数据可能没有那么糟糕,而在数据库中加密密钥可能比你想象的更糟糕

我建议我们直接谈谈,我正在做 PCI DSS 合规性工作,这个话题让我很感兴趣。

选项:主键/外键的单向哈希

PatientRecommendation会有散列patient_id- 调用它patient_hash并且Patient能够patient_hash从它生成相同的id- 但我建议将其存储patient_hash在两个表中,因为Patient它是连接的主键,PatientRecommendation它是连接的外键,

因此,您在这些术语中定义了 rails 关系,并且 rails 将不再对您的关系方案感到困惑

has_many :patient_recommendations, primary_key: :patient_hash, foreign_key: :patient_hash

结果在密码学上更健壮,更容易让数据库处理

如果您坚持不将其存储在其中patient_hash,则Patient可以使用普通的 SQL 语句来建立关系——不太方便但可行——在这个伪 SQL 的行中:

JOIN ON generate_hash(patient.id) = patient_recommendations.patient_hash

例如,Oracle 可以选择创建功能索引(想想create index generate_hash(patient.id)),因此这种方法可能非常有效,具体取决于您选择的数据库。

然而,即使有这些措施,使用连接键也会让你的生活变得复杂很多


稍后我将使用其他选项扩展此帖子

于 2014-01-23T07:09:48.320 回答