我正在考虑在Rails应用中使用attr_encrypted gem进行字段级加密。如何生成用于此gem的加密密钥?
更新
attr_encrypted使用的基础加密Encryptor的文档声明如下(在Usage | Basic下):
secret_key = Digest::SHA256.hexdigest('a secret key')
encrypted_value = Encryptor.encrypt('some string to encrypt', :key => secret_key)
我猜测a secret key
可以是任意长度的随机字符串,对hexdigest
的调用将从中计算出适当的固定长度字符串。这是推荐的方法吗?
答案 0 :(得分:7)
密钥只是一个字符串,任何字符串都可以,你只想让它远离那些不允许看到明文数据的人。您只需使用SecureRandom.base64
生成密钥即可。这会让你几乎无法通过蛮力进行攻击,只需付出很少的努力。
这里有趣的是密钥管理。您对此宝石的选择似乎是:
将密钥硬编码到应用程序中。这可以防止通过例如“意外”读取敏感数据。 DBA或支持工程师,但如果他们能够访问源代码和数据库,那么知道gem如何工作的人并不安全。
引用一个确定密钥的命名方法。这更有趣,但要注意:将密钥放入数据库并不会真正增加安全性。可以访问数据库和代码的人可以像使用硬编码一样进行操作。
通过让应用程序从开发人员(或者可能只是大多数开发人员)无法访问的位置读取至少部分密钥,您可以稍微改进一下,或至少让开发团队与加密数据分离生产。超越这一点更难,至少对于这个gem来说,因为应用程序需要运行才能访问加密/解密密钥。
这是否足够好取决于您首先加密数据的原因。