SecureRandom.hex() vs SecureRandom.random_bytes() 在 Rails 和 attr_encrypted 中生成密钥
SecureRandom.hex() vs SecureRandom.random_bytes() for key generation in Rails with attr_encrypted
attr_encrypted
的 docs 说我必须将 key = SecureRandom.random_bytes(32)
的结果存储在模型上。我认为将此密钥存储为 ENV 变量会更安全。我也习惯于 运行 rake secret
作为我的 ENV 变量。 rake secret
依赖于 SecureRandom.hex()
.
我想知道两件事:
- 我认为加密密钥应存储为 ENV 变量是否正确?
- 这两种 SecureRandom 方法的密钥加密强度是否存在差异?
hex()
与 random_bytes()
?
SecureRandom#hex
被定义为 here 为:
def hex(n=nil)
random_bytes(n).unpack("H*")[0]
end
所以他们生成的数据完全一样,只是格式不同
至于加密密钥,这取决于您和您托管应用程序的方式。如果它在您控制的服务器上,则未提交的配置文件很好(尽管环境变量方法仍然有效,显然)。如果您托管在例如Heroku,环境变量是必经之路。
attr_encrypted
的 docs 说我必须将 key = SecureRandom.random_bytes(32)
的结果存储在模型上。我认为将此密钥存储为 ENV 变量会更安全。我也习惯于 运行 rake secret
作为我的 ENV 变量。 rake secret
依赖于 SecureRandom.hex()
.
我想知道两件事:
- 我认为加密密钥应存储为 ENV 变量是否正确?
- 这两种 SecureRandom 方法的密钥加密强度是否存在差异?
hex()
与random_bytes()
?
SecureRandom#hex
被定义为 here 为:
def hex(n=nil)
random_bytes(n).unpack("H*")[0]
end
所以他们生成的数据完全一样,只是格式不同
至于加密密钥,这取决于您和您托管应用程序的方式。如果它在您控制的服务器上,则未提交的配置文件很好(尽管环境变量方法仍然有效,显然)。如果您托管在例如Heroku,环境变量是必经之路。