我正在使用以下方法加密数据密钥:
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
所以我认为这是打破它。
答案 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
解密之前,您需要对其进行解码。