我使用以下方法加密数据密钥:
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
所以我认为是它打破了它。
我认为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