У меня возникают проблемы с данными, которые я пытаюсь сохранить зашифрованными в моем приложении Rails 4. Я смотрел на множество вопросов, связанных с этим, и есть много намеков, кажется, что я почти там, но почему-то это просто не расшифрует данные. Эти два етоды:Невозможно расшифровать сохраненные зашифрованные данные
def encrypt(val, pwd_name)
cipher = OpenSSL::Cipher.new 'AES-128-CBC'
cipher.encrypt
iv = cipher.random_iv
pwd = encryptor_pwds[ pwd_name ]
salt = OpenSSL::Random.random_bytes 16
iter = 20000
key_len = cipher.key_len
digest = OpenSSL::Digest::SHA256.new
key = OpenSSL::PKCS5.pbkdf2_hmac(pwd, salt, iter, key_len, digest)
cipher.key = key
encrypted = cipher.update val
encrypted << cipher.final
encrypted = Base64.encode64(encrypted).encode('utf-8')
iv = Base64.encode64(iv).encode('utf-8')
salt = Base64.encode64(salt).encode('utf-8')
return { str: encrypted, iv: iv, salt: salt }
end
def decrypt(str, iv, salt, pwd_name)
cipher = OpenSSL::Cipher.new 'AES-128-CBC'
cipher.decrypt
str = Base64.decode64(str)
iv = Base64.decode64(iv)
salt = Base64.decode64(salt)
cipher.iv = iv
pwd = encryptor_pwds[ pwd_name ]
salt = salt
iter = 20000
key_len = cipher.key_len
digest = OpenSSL::Digest::SHA256.new
key = OpenSSL::PKCS5.pbkdf2_hmac(pwd, salt, iter, key_len, digest)
cipher.key = key
decrypted = cipher.update str
decrypted << cipher.final
return decrypted
end
И я изменил чтение/запись на, например, так:
def email=(email)
unless email.nil?
set = encrypt(email, :email)
write_attribute(:email, set[:str])
write_attribute(:email_iv, set[:iv])
write_attribute(:email_salt, set[:salt])
else
write_attribute(:email, nil)
end
end
def email
if read_attribute(:email).nil? then read_attribute(:email) else decrypt(read_attribute(:email), read_attribute(:email_iv), read_attribute(:email_salt), :email) end
end
Но когда я пытаюсь читать из него, он бросает это OpenSSL::Cipher::CipherError: bad decrypt
, что больше людей похоже, сталкиваются.
Любая помощь была бы высоко оценена!
"* что больше людей, кажется, сталкиваются с *"> Итак, что произошло, когда вы пробовали решения, предлагаемые другими темами/форумами? –
Не могли бы вы использовать эти функции с тестовым ключом/данными и распечатать ввод/вывод в шестнадцатеричных цифрах здесь? Распечатайте пароль, соль, IV и производный ключ. Очень важно, чтобы вы печатали эти значения непосредственно перед шифрованием/расшифровкой. Обратите внимание, что 'bad decrypt' может означать что угодно. Неверный ключ, неправильные данные, неправильное кодирование, неправильная соль, неправильный passwrod и, возможно, даже неправильный IV. –
Вы уверены, что кодировки верны? – imichaelmiers