Verschlüsselung / Entschlüsselung mit zwei Schlüsseln?

8

Ich möchte einige ziemlich sensible Daten mit PHP und MySQL speichern und werde hierfür eine Form der reversiblen Verschlüsselung verwenden, da ich die Daten im Klartext zurückgeben muss, damit sie nützlich sind.

Ich werde den Verschlüsselungsschlüssel aus der Kombination Benutzername / Passwort ableiten, aber ich bin ratlos, was ich tun soll, wenn ein Passwort vergessen wird. Ich verstehe, dass der Zweck der Verschlüsselung ist, dass es nur mit dem richtigen Schlüssel rückgängig gemacht werden kann, aber das muss zuvor adressiert worden sein.

Ich versuche herauszufinden, ob die Kryptografie mit öffentlichen Schlüsseln auf das Problem angewendet wird, aber alles, was mir einfällt, ist, dass der private Schlüssel immer noch korrekt sein muss, um die Daten zu entschlüsseln.

Irgendwelche Ideen?

    
Matthew 20.12.2010, 22:05
quelle

7 Antworten

3
  

Ich möchte etwas fair speichern   sensible Daten mit PHP und MySQL und   wird irgendeine Form von reversible verwenden   Verschlüsselung, um dies zu tun, da ich es brauche   Holen Sie die Daten im Klartext zurück   damit es irgendeinen Nutzen hat.

Der Schutz sensibler Daten ist gut. Jetzt:

  • Wessen Daten sind es? (Ihre, Ihre Benutzer oder eine dritte Partei?)
  • Was muss davor geschützt werden? (Offenlegung, Korruption (zufällig oder absichtlich ...)
  • Vor wem muss geschützt werden?
    • Unbeteiligte Parteien sind selbstverständlich.
    • Müssen Sie / vermeiden Sie den Zugriff auf die Klartextdaten selbst (nützlich für Abstreitbarkeit),
    • Müssen Sie schützen, dass die Daten Ihres Benutzers für Dritte sichtbar sind,
    • ?
    • Oder die Daten eines Dritten vom Benutzer,
    • Oder Ihre Daten vom Benutzer oder von Dritten?
  • Was sind wahrscheinlich Angriffe?
    • Müssen Sie schützen, wenn der Server vollständig kompromittiert ist?
    • Müssen Sie vor Angriffen auf Anwendungsebene schützen, bei denen der Benutzer einfach Zugang zu einigen, aber nicht allen verfügbaren Daten erhält (z. B. Zugriff auf die SQL-Datenbank, nicht aber auf das Dateisystem)?
    • Wird die Datenmenge so klein sein, dass der Angreifer raten und einfach überprüfen kann, ob er / sie es richtig gemacht hat? (Kurze Passwörter, Zahlen, einfache Wörter, fester Text sind wahrscheinlich Kandidaten)
    • Wird der Angreifer Klartext wissen, mit dem er angreifen kann?
  • Ist es besser, wenn die Daten weggehen (oder die Daten erneut abgerufen werden), wenn der Benutzer sein Passwort vergisst oder ist es ein erhöhtes Risiko, die Daten preiszugeben, um diese Kosten zu vermeiden?

Es gibt wahrscheinlich andere Fragen, aber das ist die Art von Dingen, über die Sie bei der Verschlüsselung nachdenken wollen. Die Antworten werden Ihnen helfen, herauszufinden, was Sie brauchen im Vergleich zu dem, was Sie wollen, und werden wahrscheinlich helfen, in die richtige Richtung zu zeigen. Sie möchten vielleicht nicht alle Antworten mit uns teilen.

  

Ich werde den Verschlüsselungsschlüssel ableiten   aus dem Benutzernamen / Passwort des Benutzers   Kombination, aber ich bin für was ratlos   im (unausweichlichen) Fall eines zu tun   Passwort wird vergessen. ich merke   dass der Zweck der Verschlüsselung das ist   es kann nur mit dem rückgängig gemacht werden   richtiger Schlüssel aber das muss gewesen sein   zuvor adressiert ..

Sie haben sich vielleicht für eine Lösung entschieden, ohne die Auswirkungen zu berücksichtigen. Das bedeutet nicht, dass die Lösung falsch ist, aber diese Frage legt nahe, dass Sie darüber nachdenken sollten, was Sie aus Sicherheitsgründen riskieren möchten. Manchmal werden Daten riskiert.

  

Ich versuche, meinen Kopf herumzubekommen   ob Kryptographie mit öffentlichem Schlüssel oder nicht   würde auf das Problem aber alle ich anwenden   Daran kann man denken, dass das der private Schlüssel ist   muss immer noch korrekt sein   entschlüssle die Daten ..

Auch das klingt nach einer Lösung auf der Suche nach einem Problem. Kryptographie mit öffentlichem Schlüssel ist nützlich, wenn Sie zwei (oder mehr) separate Akteure haben, die daran interessiert sind, Daten zwischen ihnen zu übertragen. Diese Akteure können reale (Menschen) oder funktionale (Komponenten eines Systems) sein, aber ohne zwei Akteure gibt es keinen Grund, einen separaten öffentlichen und privaten Schlüssel zu haben.

    
Slartibartfast 23.12.2010, 04:47
quelle
5

Es ist nicht klar, was Sie anstreben, so dass Ratschläge, wie Sie es umsetzen können, schwierig sind.

Standards wie PGP und S / MIME verschlüsseln jede Nachricht mit einem neuen symmetrischen Schlüssel. Diese Schlüssel werden dann für jeden Empfänger der Nachricht verschlüsselt. Anstatt die Nachricht (die sehr groß sein kann) für jeden Empfänger zu duplizieren, erhält jeder den gleichen Chiffretext, und nur der Schlüssel (der klein ist) wird dupliziert - aber für jeden Empfänger anders verschlüsselt.

Vielleicht könnten Sie hier etwas Ähnliches tun, indem Sie den Schlüssel mit dem Passwort des Benutzers verschlüsseln und eine andere Kopie mit Ihrem öffentlichen Schlüssel verschlüsseln. Wenn der Benutzer sein Kennwort vergisst, können Sie die Nachricht für ihn (nach einer entsprechenden Überprüfung der Identität der Sicherung) mit Ihrem privaten Schlüssel wiederherstellen.

    
erickson 20.12.2010 22:15
quelle
4

Die herkömmliche Lösung ist ein Wiederherstellungs-Agent : ein Benutzer, der ein zweites Kennwort enthält, mit dem alle Daten entschlüsselt werden können. Strikte Nutzungsrichtlinien würden für die Verwendung des Wiederherstellungskennworts gelten, z. B. um es physisch in einen Safe zu legen.

Dann verschlüsseln Sie entweder alle Daten zweimal: einmal mit dem Benutzerschlüssel und einmal mit dem Wiederherstellungsschlüssel. alternativ generieren Sie einen Sitzungsschlüssel für jede Datengruppe und verschlüsseln die Daten nur einmal, aber den Sitzungsschlüssel zweimal.

Damit das funktioniert, muss zumindest der Schlüssel des Wiederherstellungsagenten asymmetrisch sein, da der private Teil im Safe und der öffentliche Schlüssel in der Software lebt.

Als eine weitere Alternative, die das gleiche Schema verwendet: Verschlüsseln Sie die Passwörter des Benutzers mit dem Wiederherstellungsschlüssel bei der Passwortänderung. Dies ist einfacher zu implementieren, ermöglicht aber die Wiederherstellung der Passwörter und nicht nur der Daten, was unerwünscht sein kann.

    
Martin v. Löwis 20.12.2010 22:15
quelle
2

Grundsätzlich, wenn Sie etwas verschlüsseln und den Verschlüsselungsschlüssel verlieren, sind Sie geschraubt.

Wenn es um die Sicherung von Daten geht, müssen Sie überlegen, warum Sie es sichern und was Sie versuchen, es zu sichern. Und welche Kompromisse sich dabei ergeben sollten - das einzige wirklich sichere System ist eines, das vollständig vom Internet isoliert ist. Dies ist eine Sicherheitsstufe, die für die meisten Anwendungen selbstzerstörerisch ist.

Hier sind einige Fragen, die Sie sich stellen sollten:

  1. Wenn jemand meine Datenbank kompromittiert, ist es akzeptabel, dass er auf diese Daten zugreifen kann?
  2. Was passiert, wenn jemand meinen gesamten Anwendungsstapel kompromittiert?

Wenn die Antworten auf die obigen zwei Fragen "nein" sind, muss das Schlüsselmaterial vom Benutzer gehalten werden. Und sie verlieren den Zugriff auf ihre Daten, wenn sie den Schlüssel verlieren.

Sie können eine Option für die manuelle Schlüsselwiederherstellung bereitstellen, wenn Sie auch einen "Hauptschlüssel" haben, den Sie nicht in der Nähe Ihrer Anwendung speichern und Sie verwenden es, um Passwörter manuell zurückzusetzen. Wenn das auch keine Option ist (sagen wir, nur der Benutzer sollte auf die Daten zugreifen können, nicht der Systemadministrator), dann müssen Sie irgendwo einen Kompromiss eingehen.

    
Anon. 20.12.2010 22:17
quelle
2

Dies ist eine Frage, die ich über mich selbst gestellt habe und wie ich es sehe, sind die folgenden Optionen verfügbar (wobei Option Nr. 1 am sichersten ist):

  1. Stellen Sie keine Funktionen zum Zurücksetzen des Passworts bereit - wenn sie ihr Passwort vergessen haben, sind sie gesperrt.

  2. Erstellen Sie einen neuen sicheren Hauptschlüssel und verschlüsseln Sie & amp; Hash des Benutzerschlüssels mit diesem Hauptschlüssel und Speichern des Chiffretextes und des Hash-Ergebnisses in der Datenbank. Der sichere Schlüssel wird dann dem Benutzer entweder durch Hinzufügen zu einer Datei, die der Benutzer herunterlädt, dem Benutzer per E-Mail oder durch Anzeigen des sicheren Hauptschlüssels auf dem Bildschirm bekannt gemacht. Um das Passwort zurückzusetzen, müsste der Benutzer diesen Hauptschlüssel eingeben, der dann gehackt und verglichen wird. Wenn sie übereinstimmen, wird der Schlüssel des Benutzers in der Datenbank entschlüsselt.

  3. Bitten Sie den Benutzer, bei der Registrierung zwei Sicherheitsfragen und Antworten anzugeben. Hash die Antworten und speichern Sie die Fragen und beantworten Sie Hash in der Datenbank. Die zweite Antwort wird als Hauptschlüssel zum Verschlüsseln des Benutzerschlüssels verwendet. Um eine E-Mail zum Zurücksetzen des Passworts zu erhalten, muss der Benutzer die erste Frage korrekt beantworten. Sobald sie auf den Link in der E-Mail klicken, fragt die Webseite die zweite Frage ab. Wenn dies korrekt ist und die Parameterwerte der Abfragezeichenfolge gültig sind, verwenden Sie die Antwort auf die zweite Frage, um den Benutzerschlüssel zu entschlüsseln.

  4. Verwenden Sie einen globalen Anwendungsschlüssel (möglicherweise in der Web- / UI-Anwendung gespeichert und verwenden Sie diesen zum Verschlüsseln und Speichern des Benutzerschlüssels. Sobald ein Benutzer durch einen E-Mail-Vorgang zum Zurücksetzen des Kennworts verifiziert wurde, wird der Schlüssel des Benutzers entschlüsselt Anwendung globalen Hauptschlüssel und dann mit ihrem neuen Passwort erneut verschlüsselt.

Zusammenfassend ist der Nutzen jeder Option wie folgt:

  1. Dies ist das Nonplusultra für die Sicherheit und wäre möglicherweise die einzige Option, wenn die Daten entscheidend wären, um verschlüsselt zu bleiben. In der realen Welt jedoch vergessen die Menschen ihre Passwörter so sicher, wie die Sonne aufgeht, und die Bereitstellung einer Reset-Passwort-Funktion könnte eine schlechte kommerzielle Entscheidung sein.

  2. Dies ist sicher, da der Hauptschlüssel nicht im Frontend oder in der Datenbank gespeichert ist. Wenn also die Plattform kompromittiert wird, müssen die Daten erheblich entschlüsselt werden. Der Nachteil ist jedoch, dass der Benutzer trotzdem seinen Hauptschlüssel verlieren kann.

  3. Die Schwäche hier ist, wenn die Datenbank kompromittiert ist, könnte die Antwort auf die Frage erforscht werden und dann verwendet werden, um den verschlüsselten Schlüssel des Benutzers zu entschlüsseln.

  4. Bei diesem Ansatz bleibt der Anwendungsschlüssel im Stapel und Ihre Daten sind anfällig, wenn Ihre Plattform gehackt wird. Der einzige Schutz, den Sie haben, ist, dass, wenn der Datenbankserver gehackt wird, die Daten immer noch sicher sind.

Wie bei den meisten Dingen in der Welt der Softwareentwicklung müssen Sie überlegen, was das Beste für das ist, was Sie erreichen wollen, und auf das richtige Gleichgewicht achten.

    
Alan Savage 19.01.2011 23:19
quelle
1

Warum verwenden Sie für jeden Benutzer einen anderen Schlüssel?

Wenn Sie einen Schlüssel auswählen, ist es viel einfacher zu handhaben.

Speichern Sie Ihren Verschlüsselungsschlüssel außerhalb der Datenbank.

Ihre Anwendung muss weiterhin Zugriff darauf haben, aber jemand mit einem db-Dump kann die verschlüsselten Informationen nicht lesen.

    
Byron Whitlock 20.12.2010 22:10
quelle
1
  1. Generieren Sie einen zufälligen Sitzungsschlüssel.
  2. Verwenden Sie den Sitzungsschlüssel, um die Daten zu verschlüsseln.
  3. Verschlüsseln Sie den zufälligen Schlüssel mit einer beliebigen Anzahl von Benutzerpasswörtern, die Sie benötigen.

Auf diese Weise können Sie ein beliebiges Benutzerkennwort zum Entschlüsseln der Daten verwenden.

    
quelle

Tags und Links