Wie generieren Verschlüsselungsschlüssel zur Verwendung mit attr_encrypted
Ich überlege mir, mit dem attr_encrypted Juwel für Feld-level-Verschlüsselung in eine Rails-app. Wie erstelle ich einen Verschlüsselungs-Schlüssel für die Verwendung mit diesem gem?
Update:
In der Dokumentation für Encryptor, die die zugrunde liegende Verschlüsselung verwendet attr_encrypted, besagt Folgendes (unter Verwendung | Basic):
secret_key = Digest::SHA256.hexdigest('a secret key')
encrypted_value = Encryptor.encrypt('some string to encrypt', :key => secret_key)
Ich würde vermuten, dass a secret key
kann jede beliebige Länge beliebige Zeichenfolge und der Aufruf hexdigest
berechnen eine entsprechende Zeichenfolge fester Länge aus. Ist dies der empfohlene Weg, es zu tun?
- Ich versuchte zu Antworten, aber habe eine Frage: wer (oder welche Art von Szenario) sind Sie versuchen zu halten, die Klartext-Daten geheim?
- Bestimmte Felder in der Datenbank verschlüsselt, rest vor allem für off-site-backup-Zwecke (wo die off-site-backup-system keinen Zugriff auf den Verschlüsselungsschlüssel).
- In diesem Fall würde ich denke, die off-site-system hat Zugriff auf die Daten, aber nicht die Konfiguration oder source-code? Ich würde wahrscheinlich immer noch err Richtung Konfiguration zu speichern, zumindest einen Teil der Taste, und verwenden Sie die gem Möglichkeit zum aufrufen einer Methode zum abrufen des korrekten Schlüssel aus, der als eine Art der Ernährung, die in. Aber wenn der source-code gesichert ist, unabhängig von der backup-Daten, hard-Kodierung verschlüsseln Tasten pro Feld ist praktikabel, auch.
- Das ist richtig, Neil. Wie bereits in meinem Kommentar auf deine Antwort, die sicherungen und source-code wird getrennt von der Konfiguration, die enthält die Verschlüsselungs-Schlüssel. Non-Produktion-Implementierungen (zum testen, etc.) haben keinen Zugriff auf die Produktions-Konfiguration.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem Schlüssel ist nur eine Zeichenfolge, die Zeichenfolge tun, Sie wollen einfach nur, um es zu halten Weg von Menschen, die nicht sehen dürfen, die Klartext-Daten. Man könnte einfach einen Schlüssel erzeugen mit
SecureRandom.base64
. So wäre es praktisch unguessable durch brute-force, mit sehr wenig Aufwand von Ihnen.Das interessante hier ist das Schlüssel-management. Ihre Möglichkeiten mit diesem Juwel zu sein scheinen:
Hard-code der Schlüssel in der Anwendung. Dies verhindert ein "versehentliches" Lesen von sensiblen Daten, z.B. durch einen DBA oder support-Techniker, aber es ist nicht sicher aus, wer weiß, wie das Schmuckstück funktioniert, wenn Sie den Zugriff auf den Quellcode und die Datenbank.
Verweis auf eine benannte Methode, die Bestimmung der Tonart. Dieses ist mehr interessant, aber Vorsicht: Setzen Sie den Schlüssel in der Datenbank nicht wirklich viel Sicherheit. Jemand, der Zugriff auf die Datenbank und den code kann viel tun, die gleiche, als wenn der Wert hart codiert wurden.
Können Sie verbessern, die Dinge ein wenig, oder zumindest die team-Entwicklung getrennt von den verschlüsselten Daten, indem er den Antrag gelesen, zumindest einen Teil der Schlüssel aus einem Ort, dass die Entwickler (oder vielleicht auch nur die Mehrheit der Entwickler) nicht zugreifen kann in der Produktion. Darüber hinaus gehende ist schwieriger, zumindest mit diesem Schmuckstück ist, weil die Anwendung ausführen müssen, um den Zugang zu der ver - /Entschlüsselung-Schlüssel.
Nicht ob dies gut genug ist, hängt davon ab, warum Sie die Verschlüsselung der Daten in den ersten Platz.
SecureRandom.base64
sollte ausreichend sein (~22 unterschiedlichen Zeichen), als die anderen würde ich wahrscheinlich pick-sagen wir 20 Zeichen, plus, wie Sie sich leisten können, etwas zu haben, das wäre umständlich zu geben. Macht Sie extra-lange nicht wirklich erhöhen die Sicherheit für Sie, IMO.attr_encrypted
version3.0.0+
muss der Schlüssel mindestens 32 Zeichen lang sein (Standard-configs). Einige der verschiedenen encryptor-algorithmen erfordern viel mehr Tasten...variiert von encryptor. Einfach nur zu erwähnen, weil ich soeben das3.0.0
version in einer app arbeite ich auf und lief über die situation indevelopment
.