56 Stimmen

Verschlüsseln, entschlüsseln mit Rails

Ich habe vor einiger Zeit die Möglichkeit gesehen, Strings in Rails zu ent- und verschlüsseln, ohne eine Bibliothek einzubinden, aber ich kann den Blogbeitrag nicht finden.

Ich möchte Zeichenketten verschlüsseln und entschlüsseln können, ohne etwas einzuschließen. Mit dem gleichen Schlüssel hat für die alles andere in Schienen, signierte Cookies zum Beispiel.

Irgendwelche Ideen?

143voto

gertas Punkte 16291

Meinen Sie das hier? ActiveSupport::MessageEncryptor . Hier ist der Weg zur Wiederverwendung von Rails 5+ auf Ruby 2.4+ Anwendung das Geheimnis:

crypt = ActiveSupport::MessageEncryptor.new(Rails.application.secrets.secret_key_base[0..31])
encrypted_data = crypt.encrypt_and_sign('my confidental data')

Und verschlüsselte Daten können mit entschlüsselt werden:

decrypted_back = crypt.decrypt_and_verify(encrypted_data)

Das obige Beispiel verwendet die ersten 32 Zeichen des Rails-App-Geheimnisses als Verschlüsselungs- und Signierschlüssel, da der Standard MessageEncryptor Chiffre aes-256-gcm erfordert genau 256-Bit-Schlüssel. Konventionell generiert Rails bei der App-Erstellung ein Geheimnis in Form einer Zeichenkette aus 128 Hex-Ziffern.

Wichtig! Ruby 2.4 Upgrade-Hinweis

Vor Ruby 2.4 y Schiene 5 gab es keine Beschränkung der Schlüsselgröße, und es war üblich, das gesamte Geheimnis einfach in den Verschlüsselungsinitialisierer einzufügen:

# pre-2.4
crypt = ActiveSupport::MessageEncryptor.new(Rails.application.secrets.secret_key_base)

Intern verwendete der Verschlüsselungsalgorithmus (AES256GCM von OpenSSL) nur 32 Zeichen des Schlüssels, aber der Signieralgorithmus (SHA1) verbrauchte alle 128 Zeichen.

Wenn also eine Anwendung von vor 2.4 Ruby aktualisiert wird und die Anwendung zuvor die Daten mit einer unbeschränkten Schlüsselgröße verschlüsselt hat, wird die MessageEncryptor muss ein vollständiges Geheimnis im zweiten Parameter erhalten, um zu vermeiden, dass ActiveSupport::MessageVerifier::InvalidSignature über die Entschlüsselung der Altdaten:

# post-2.4 upgrade
crypt = ActiveSupport::MessageEncryptor.new(Rails.application.secrets.secret_key_base[0..31], Rails.application.secrets.secret_key_base)

18voto

guero64 Punkte 906

In Rails 5 muss der Schlüssel 32 Byte lang sein.

Bearbeiten Sie die Antwort für Rails 4, die auch für Rails 5 funktioniert:

 key = SecureRandom.random_bytes(32)
 crypt = ActiveSupport::MessageEncryptor.new(key) 
 encrypted_data = crypt.encrypt_and_sign('my confidental data')

Entschlüsseln:

 decrypted_back = crypt.decrypt_and_verify(encrypted_data)

9voto

estani Punkte 20703

Rails 5 Aktualisierung:

crypt = ActiveSupport::MessageEncryptor.new(Rails.application.secrets.secret_key_base[0..31])
encrypted_data = crypt.encrypt_and_sign('my confidental data')

Rails 5.x benötigt einen Schlüssel von genau 32 Bytes.

Um eine zuvor signierte Nachricht mit einem längeren Schlüssel zu verifizieren:

crypt = ActiveSupport::MessageEncryptor.new(Rails.application.secrets.secret_key_base[0..31], Rails.application.secrets.secret_key_base)
encrypted_data = crypt.encrypt_and_sign('my confidental data')

wie beschrieben in der Dokumentation y el Diskussion zu dieser Änderung

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X