我正在构建一个需要HIPAA合规性的应用程序,该应用程序要削减追逐,这意味着我无法在数据库中自由查看某些连接(患者和患者和对他们的建议)。
这些表通过我的应用程序中的patients_recommendations
表连接,该表效果很好,直到我通过attr_encrypted添加加密为止。为了减少加密和解密(以及关联的开销)的量,我希望能够简单地将patient_id
加密在patients_recommendations
表中。但是,将数据类型更改为string
,将列名更改为encrypted_patient_id
时,当我尝试重新播放数据库时,该应用程序会因以下错误而断开:
不能写未知属性`deration_id'
我认为这是因为联接是直接寻找列,而不是通过浏览模型(使用模型可能较慢)。有什么办法可以使铁轨通过模型(attr_encrypted
添加了必要的辅助方法)?
更新:
为了找到工作能力,我尝试在类似的模型中添加一个trefor_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
的任何想法?
您可能应该将PII数据和PHI数据存储在单独的DBS中。对PII数据进行加密(包括与提供商或提供商位置的任何关联),然后将所有PHI数据放大以使其更容易。只要两者之间没有直接关联,就可以接受PHI数据在匿名化的情况下加密。
计划
在encrypt_patient_id
中不要将patient_id
设置为nil
,因为它不存在,并且问题可能会消失。
此外,用nil
或false
结束回调将停止回调链,将显式true
放在方法末尾。
计划B,重新考虑您的选项
还有更多选项 - 从数据库级透明加密(正式加密磁盘上的数据)到加密文件系统以存储某些表格,再到将列中的数据固定。
中的数据。加密加入列听起来像是一条通往不幸的道路,其原因从报告问题到绩效问题的各种原因可能非常严重,
您目前在种子上遇到的麻烦看起来像是它是由于有望成为糟糕的道路所造成的第一个颠簸(在这种情况下,ActivereCord似乎很困惑如何处理您的协会,它试图设置patient_id
关于初始化和断裂)。
加密数据的开销可能并不像您想象的那样高,不确定HIPAA的情况,但是对于PCI,您并不是完全鼓励您在屏幕上呈现受保护的数据,因此加密仅会产生一个小的开销,因为它发生相对较少的发生(商业需要的知识等)。
此外,内存可能被认为是"不在静止的,也不是在运输中",从理论上讲,您可以缓存一些有限时间时期的明确值,从而节省了开头的解密。
基本上,加密数据可能并不糟糕,并且在数据库中加密密钥可能会更糟,然后您认为
我建议我们直接交谈,我正在做PCI DSS合规性,这个话题让我感兴趣。
选项:初级/外键的1路哈希
PatientRecommendation
将具有patient_id
的哈希 - 称其为patient_hash
,并且Patient
能够从其id
中生成相同的patient_hash
-但我建议将patient_hash
存储在这两个表中,对于Patient
对于PatientRecommendation
,这将是加入的外键,
因此,您以这些术语定义了铁轨关系,而铁轨将不再对您的关系方案感到困惑
has_many :patient_recommendations, primary_key: :patient_hash, foreign_key: :patient_hash
,结果在密码上更强大且容易使数据库处理
如果您坚持不在Patient
中存储patient_hash
,则可以使用普通的SQL语句来执行关系 - 不太方便但可行 - 此pseudosql的某些东西:
JOIN ON generate_hash(patient.id) = patient_recommendations.patient_hash
oracle可以选择制作功能索引(想想create index generate_hash(patient.id)
),因此,根据您选择的数据库,此方法可能非常有效。
但是,即使采用这些措施
我将稍后在此帖子上扩展其他选项