2013-08-30 4 views
1

У меня возникают проблемы с данными, которые я пытаюсь сохранить зашифрованными в моем приложении 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, что больше людей похоже, сталкиваются.

Любая помощь была бы высоко оценена!

+0

"* что больше людей, кажется, сталкиваются с *"> Итак, что произошло, когда вы пробовали решения, предлагаемые другими темами/форумами? –

+0

Не могли бы вы использовать эти функции с тестовым ключом/данными и распечатать ввод/вывод в шестнадцатеричных цифрах здесь? Распечатайте пароль, соль, IV и производный ключ. Очень важно, чтобы вы печатали эти значения непосредственно перед шифрованием/расшифровкой. Обратите внимание, что 'bad decrypt' может означать что угодно. Неверный ключ, неправильные данные, неправильное кодирование, неправильная соль, неправильный passwrod и, возможно, даже неправильный IV. –

+0

Вы уверены, что кодировки верны? – imichaelmiers

ответ

3

Это было немного сложно понять, но проблема была не в моей логике шифрования, а в фильтре Devise. Создайте нижестоящие адреса электронной почты перед сохранением по умолчанию, но поскольку я их шифрую и кодирую, я сохраняю строчные строки UTF8 в db. Нижняя шкала, декодирование строк назад к ASCII приводила к различным результатам, чем вещь перед сохранением, и это делало невозможным дешифрование.

Теперь, если кто-нибудь сталкивается с этим, найдите case_insensitive_keys в config/initializers/devise.rb и убедитесь, что он не содержит ключей, которые вы сохраняете зашифрованными. Имейте в виду, что если вы сделаете это, вам лучше либо ввести строчные буквы в сообщения электронной почты самостоятельно, либо подтвердить, и запретить прописные буквы в электронных письмах, что-то вроде этого.

Смежные вопросы