Мне нужно подражать тому, что делает MySQL при шифровании и расшифровке строк с использованием встроенных функций AES_ENCRYPT() и AES_DECRYPT().Функции Mimic AES_ENCRYPT и AES_DECRYPT в Ruby
Я прочитал пару сообщений в блогах, и, судя по всему, MySQL использует 128-битное шифрование AES для этих функций. Кроме того, поскольку для этого шифрования требуется 16-разрядный ключ, MySQL заполняет строку символами x0 (\ 0s) до 16-битного размера.
Алгоритм в исходном коде от MySQL замечен here.
Теперь мне нужно реплицировать то, что делает MySQL в приложении Rails, но все, что я пробовал, не работает.
Вот способ повторить поведение я получаю:
1) Создание нового Rails приложения
rails encryption-test
cd encryption-test
2) Создать новые подмости
script/generate scaffold user name:string password:binary
3) редактировать свой config/database.yml и добавить тестовую базу данных MySQL
development:
adapter: mysql
host: localhost
database: test
user: <<user>>
password: <<password>>
4) Запустить миграцию
rake db:migrate
5) Введите консоль, создать пользователя и обновить свой пароль от MySQL запросов
script/console
Loading development environment (Rails 2.2.2)
>> User.create(:name => "John Doe")
>> key = "82pjd12398JKBSDIGUSisahdoahOUASDHsdapdjqwjeASIduAsdh078asdASD087asdADSsdjhA7809asdajhADSs"
>> ActiveRecord::Base.connection.execute("UPDATE users SET password = AES_ENCRYPT('password', '#{key}') WHERE name='John Doe'")
Вот где я застрял. Если я попытаюсь расшифровать его, используя MySQL работает:
>> loaded_user = User.find_by_sql("SELECT AES_DECRYPT(password, '#{key}') AS password FROM users WHERE id=1").first
>> loaded_user['password']
=> "password"
Однако, если я пытаюсь использовать библиотеку OpenSSL, нет никакого способа, я могу заставить его работать:
cipher = OpenSSL::Cipher::Cipher.new("AES-128-ECB")
cipher.padding = 0
cipher.key = key
cipher.decrypt
user = User.find(1)
cipher.update(user.password) << cipher.final #=> "########gf####\027\227"
Я попытался обивка ключ :
desired_length = 16 * ((key.length/16) + 1)
padded_key = key + "\0" * (desired_length - key.length)
cipher = OpenSSL::Cipher::Cipher.new("AES-128-ECB")
cipher.key = key
cipher.decrypt
user = User.find(1)
cipher.update(user.password) << cipher.final #=> ""|\e\261\205:\032s\273\242\030\261\272P##"
Но это действительно не работает.
Кто-нибудь знает, как я могу имитировать поведение функций AES_ENCRYPT() и AES_DECRYPT() MySQL в Ruby?
Спасибо!
Прохладный, вы получили это :) –