Je dois imiter ce que fait MySQL lors du cryptage et du décryptage de chaînes à l'aide des fonctions intégrées AES_ENCRYPT() et AES_DECRYPT().Fonctions Mimic AES_ENCRYPT et AES_DECRYPT dans Ruby
J'ai lu quelques articles de blog et apparemment MySQL utilise le cryptage AES 128 bits pour ces fonctions. De plus, étant donné que ce chiffrement nécessite une clé de 16 bits, MySQL remplit la chaîne avec des caractères x0 (\ 0s) jusqu'à ce que sa taille soit de 16 bits.
L'algorithme en C du code source MySQL est repéré here.
Maintenant, j'ai besoin de répliquer ce que fait MySQL dans une application Rails, mais chaque chose que j'ai essayé ne fonctionne pas.
est ici un moyen de reproduire le comportement que je reçois:
1) Créer une nouvelle application Rails
rails encryption-test
cd encryption-test
2) Créer un nouvel échafaudage
script/generate scaffold user name:string password:binary
3) Modifier votre config/database.yml et ajouter un test Base de données MySQL
development:
adapter: mysql
host: localhost
database: test
user: <<user>>
password: <<password>>
4) Exécutez la migration
rake db:migrate
5) Entrez console, créez un utilisateur et mettre à jour son mot de passe de MySQL requête
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'")
C'est là que je me suis coincé. Si je tente de le déchiffrer, en utilisant MySQL cela fonctionne:
>> loaded_user = User.find_by_sql("SELECT AES_DECRYPT(password, '#{key}') AS password FROM users WHERE id=1").first
>> loaded_user['password']
=> "password"
Toutefois, si je tente d'utiliser la bibliothèque OpenSSL, il n'y a aucun moyen que je peux le faire fonctionner:
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"
J'ai essayé padding la clé :
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##"
Mais cela ne fonctionne vraiment pas.
Quelqu'un at-il une idée sur comment puis-je imiter le comportement des fonctions MySQL AES_ENCRYPT() et AES_DECRYPT() dans Ruby?
Merci!
Cool, tu l'as eu :) –