您好我正在使用可以存储敏感医疗记录的rails应用程序,因此我一直在寻找加密存储数据的最佳实践方法。我决定使用提供对称加密的gem保险箱,方法是生成随机密钥和IV,然后加密带有公钥的密钥。应用程序需要向用户和一系列特殊用户(注册医生)提供对加密数据的访问。
我的问题涉及这样一个事实,即我需要工作流程有两个我不太确定如何实现的属性:
第一个问题是我想使用登录的用户的密码并提交数据作为公钥,但我使用的是存储加密密码的gem Devise 。我不想使用加密密码,因为如果有人能够访问数据库,它可能会破坏加密工作流程。
第二第二个问题是加密信息不仅需要由创建信息的用户访问,还需要由一系列特殊用户(医疗用户)访问。我知道PHP有一个函数openssl_seal,可以使用一组公钥,但我不确定实现:
我是否需要为每个收件人公钥加密和存储对称密钥? 或者我可以只提供所有公钥和我们加密和存储一次
第三问题是第一个和第二个的组合,如何在不在服务器上存储可能危及工作流安全性的任何内容的情况下访问多个收件人的公钥?
我正在寻找的是关于架构概述而不是实际(代码)实现的一些建议和讨论。
答案 0 :(得分:0)
使用密码甚至加密密码作为公钥是一个坏主意,因为如果他们的密码更改,那么你的“公钥”也是如此。相反,我会为用户api_key
或public_key
构建一个额外的字段(您明白了)。创建用户后,生成公钥。
before_create :new_user_settings def new_user_settings begin self.api_key = SecureRandom.hex end while self.class.exists?(api_key: api_key) end
这种方式可以解决您的第二和第三个问题,因为您在用户模型中有一个可以解密数据的公钥。您可以做的一件事是帮助防止可能访问您的数据库的人将用户的公钥与另一个公钥组合在一起。这样,用户的公钥只是部分公钥,而另一半从不存储在数据库中,而是存储在全局变量(或其他东西)中。合并的两半将是用于解密数据的实际公钥。