如何生成用于attr_encrypted的加密密钥

Ric*_*ook 6 ruby cryptography ruby-on-rails

我正在考虑在Rails应用程序中使用attr_encrypted gem进行字段级加密.如何生成用于此gem的加密密钥?

更新:

Encryptor的文档(attr_encrypted使用的基础加密)声明如下(在Usage | Basic下):

secret_key = Digest::SHA256.hexdigest('a secret key')
encrypted_value = Encryptor.encrypt('some string to encrypt', :key => secret_key)
Run Code Online (Sandbox Code Playgroud)

我猜这a secret key可以是任意长度的随机字符串,并且调用hexdigest将从中计算适当的固定长度字符串.这是推荐的方法吗?

Nei*_*ter 7

密钥只是一个字符串,任何字符串都可以,你只想让它远离那些不允许看到明文数据的人.您可以使用简单生成密钥SecureRandom.base64.这会让你几乎无法通过蛮力进行攻击,只需要很少的努力.

这里有趣的是密钥管理.您对此宝石的选择似乎是:

  • 将密钥硬编码到应用程序中.这可以防止例如DBA或支持工程师"意外"读取敏感数据,但如果他们能够访问源代码和数据库,那么知道gem如何工作的人并不安全.

  • 引用一个确定密钥的命名方法.这更有趣,但要注意:将密钥放入数据库并不会真正增加安全性.可以访问数据库和代码的人可以像使用硬编码值那样做很多事情.

通过让应用程序从开发人员(或者可能只是大多数开发人员)无法在生产中访问的位置读取至少部分密钥,您可以稍微改进一下,或者至少让开发团队与加密数据分离.超越它更难,至少在这个gem中是这样,因为应用程序需要运行才能访问加密/解密密钥.

这是否足够好取决于您首先加密数据的原因.

  • @RichardCook:关注你关于密钥长度的评论.在`attr_encrypted`版本`3.0.0 +`中,密钥长度必须至少为32个字符(使用默认配置).一些不同的加密算法实际上需要更长的密钥......因加密器而异.刚刚提到这一点,因为我刚刚在我正在开发的应用程序中添加了"3.0.0"版本并在`development`中遇到了这种情况. (3认同)