加密器和MySQL,保存数据库/编码的关键?

时间:2011-05-26 20:18:58

标签: ruby-on-rails ruby-on-rails-3 encryption

我正在使用以下方法加密数据密钥:

data_key      = ActiveSupport::SecureRandom.random_number(99999999)
secret_key    = Digest::SHA256.hexdigest(params[:user][:password])
encrypted_key = Encryptor.encrypt(data_key.to_s, :key => secret_key)

encrypted_key将等于,例如:

  

“%\ x807 \ x1F的\ xFE.N \ XEC \ X85 \ X04 \ XEA \ XED(\ XD6 \ XFC \ xC9”

如果我尝试使用以下方法将其保存在我的MySQL数据库中:

Key.create(:encrypted_key => encrypted_key)

保存到:encrypted_key列的唯一值是:

  

我尝试过另一个:

  

“2T`E \ xBDP \ X12 \ X81 \ x00U \ X92 \ xFE如果\ X1A \ XDC = \ XA4”

列中的哪些商店:

  

2T`E

所以我认为这是打破它。

1 个答案:

答案 0 :(得分:2)

我认为MySQL可能只存储ASCII字符。 '\ x ???'字符是unicode字符。

我建议在存储它之前对Base64进行编码:

data_key      = ActiveSupport::SecureRandom.random_number(99999999)
secret_key    = Digest::SHA256.hexdigest(params[:user][:password])
encrypted_key = Encryptor.encrypt(data_key.to_s, :key => secret_key)
encoded_key   = Base64.encode64(encrypted_key)
Key.create(:encrypted_key => encoded_key)

这会将所有非ASCII字符编码为纯ASCII。

当您从数据库中读取密钥时,在使用`Base64.decode64

解密之前,您需要对其进行解码。