2013-07-01 59 views
5

我正在考虑在Rails应用中使用attr_encrypted gem来进行字段级加密。我如何生成一个加密密钥用于这个宝石?如何生成与attr_encrypted一起使用的加密密钥

更新:

Encryptor的文档,这是attr_encrypted使用的底层加密,规定如下(根据使用说明|基本):

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

我猜想,a secret key可以是任意随机字符串,并且调用hexdigest将根据它计算适当的固定长度的字符串。这是推荐的方式吗?

+0

我试着回答,但有一个问题:你想保护明文数据的人是谁(或者什么样的场景)? –

+0

数据库中的某些字段需要在休息时加密,主要用于非现场备份(场外备份系统无法访问加密密钥)。 –

+0

在这种情况下,我猜想非现场系统可以访问数据,但不能访问配置或源代码?我可能仍然会错误地配置存储至少部分密钥,并使用gem的能力来调用方法来获取正确的密钥,以此作为提供该密钥的方式。但是,如果源代码的安全性与备份数据无关,每个字段的加密密钥的硬编码也是可行的。 –

回答

6

关键字只是一个字符串,任何字符串都会这样做,您只是想让它远离不允许看到明文数据的人。您只需使用SecureRandom.base64即可生成密钥。这会使得它几乎无法通过蛮力来推测,只需你很少的努力。

这里有趣的是密钥管理。这个宝石的选择似乎是:

  • 硬编码到应用程序的关键。这防止了例如通过例如“意外”读取敏感数据。一个DBA或者支持工程师,但是如果他们能够访问源代码和数据库,那么任何知道该gem是如何工作的人都是不安全的。

  • 引用将决定密钥的命名方法。这更有意思,但要小心:将密钥放入数据库并不能真正增加安全性。可以访问数据库和代码的人可以做很多事情,就好像该值是硬编码的一样。

,可以稍微改善的事情,或者至少,通过让应用程序从一个位置读取的密钥的至少一部分得到加密的数据分离的开发团队,开发人员(或者只是广大开发者)无法在生产中访问。除此之外,更难的是,至少现在这个宝石,因为应用程序需要运行时才能访问加密/解密密钥。

这是否足够好取决于你为什么要首先加密数据。

+0

+1。谢谢,尼尔。在我的情况下,加密的主要目的是对数据库备份中的其余数据进行加密,这些数据库备份将在场外和物理上与密钥分开。密钥也将与代码保持分开:最有可能的是,它将通过仅设置为生产服务器上的生产密钥值的环境变量进行设置。密钥不会嵌入到应用程序的源代码中。 –

+0

生成的密钥需要多长时间? –

+0

'SecureRandom.base64'的默认输出应该是足够的(〜22个不同的字符),除了我可能会选择说20个字符外,因为你可以承担一些难以输入的东西。让它延长并不能真正提高IMO的安全性。 –