Eine Sache, die ich hier nicht erwähnt habe, obwohl sie eine Erweiterung von Marcus Adams 'Antwort ist, ist, dass Sie keine einzige Information verwenden sollten, um einen Benutzer zu identifizieren und zu authentifizieren, wenn die Möglichkeit von Timing-Angriffen besteht , die dies können Verwenden Sie die Unterschiede in den Antwortzeiten, um zu erraten, wie weit ein Zeichenfolgenvergleich gekommen ist.
Wenn Sie ein System verwenden, das einen "Schlüssel" verwendet, um den Benutzer oder die Anmeldeinformationen nachzuschlagen, können diese Informationen im Laufe der Zeit schrittweise erraten werden, indem Tausende von Anforderungen gesendet und die Zeit untersucht werden, die Ihre Datenbank benötigt, um sie zu finden (oder nicht) finde) einen Datensatz. Dies gilt insbesondere dann, wenn der "Schlüssel" im Klartext anstelle eines Einweg-Hash des Schlüssels gespeichert ist. Sie möchten die Schlüssel der Benutzer im Klartext oder symmetrisch verschlüsselt speichern, wenn Sie den Schlüssel dem Benutzer erneut anzeigen möchten.
Wenn Sie über eine zweite Information oder ein "Geheimnis" verfügen, können Sie zuerst den Benutzer oder den Berechtigungsnachweis mithilfe des "Schlüssels" nachschlagen, der für einen Timing-Angriff anfällig sein könnte, und dann mithilfe einer zeitsicheren Vergleichsfunktion den Wert von überprüfen das Geheimnis".
Hier ist Pythons Implementierung dieser Funktion:
https://github.com/python/cpython/blob/cd8295ff758891f21084a6a5ad3403d35dda38f7/Modules/_operator.c#L727
Und es ist in der hmac
Bibliothek (und wahrscheinlich auch in anderen) ausgesetzt :
https://docs.python.org/3/library/hmac.html#hmac.compare_digest
Eine Sache, die hier zu beachten ist, ist, dass ich nicht denke, dass diese Art von Angriff auf Werte funktioniert, die vor der Suche gehasht oder verschlüsselt wurden, da sich die verglichenen Werte jedes Mal zufällig ändern, wenn sich ein Zeichen in der Eingabezeichenfolge ändert. Ich habe hier eine gute Erklärung dafür gefunden .
Lösungen zum Speichern von API-Schlüsseln wären dann:
- Verwenden Sie einen separaten Schlüssel und ein separates Geheimnis, verwenden Sie den Schlüssel, um den Datensatz nachzuschlagen, und verwenden Sie einen zeitsicheren Vergleich, um das Geheimnis zu überprüfen. Auf diese Weise können Sie dem Benutzer den Schlüssel und das Geheimnis erneut einem Benutzer zeigen.
- Verwenden Sie einen separaten Schlüssel und ein separates Geheimnis, verwenden Sie eine symmetrische, deterministische Verschlüsselung für das Geheimnis und führen Sie einen normalen Vergleich verschlüsselter Geheimnisse durch. Auf diese Weise können Sie dem Benutzer den Schlüssel und das Geheimnis erneut anzeigen und müssen keinen zeitsicheren Vergleich durchführen.
- Verwenden Sie einen separaten Schlüssel und ein separates Geheimnis, zeigen Sie das Geheimnis an, hashen und speichern Sie es und führen Sie dann einen normalen Vergleich des gehashten Geheimnisses durch. Dadurch entfällt die Notwendigkeit der bidirektionalen Verschlüsselung, und Sie haben den zusätzlichen Vorteil, dass Sie Ihr Geheimnis sicher aufbewahren, wenn das System kompromittiert wird. Es hat den Nachteil, dass Sie dem Benutzer das Geheimnis nicht erneut zeigen können.
- Verwenden Sie einen einzelnen Schlüssel , zeigen Sie ihn dem Benutzer einmal, hashen Sie ihn und führen Sie dann eine normale Suche des gehashten oder verschlüsselten Schlüssels durch. Dies verwendet einen einzelnen Schlüssel, kann dem Benutzer jedoch nicht erneut angezeigt werden. Hat den Vorteil, dass die Schlüssel sicher sind, wenn das System kompromittiert wird.
- Verwenden Sie einen einzelnen Schlüssel , zeigen Sie ihn dem Benutzer einmal, verschlüsseln Sie ihn und führen Sie eine normale Suche nach dem verschlüsselten Geheimnis durch. Kann dem Benutzer erneut angezeigt werden, jedoch auf Kosten der Verwundbarkeit von Schlüsseln, wenn das System gefährdet ist.
Von diesen denke ich, dass 3 das beste Gleichgewicht zwischen Sicherheit und Komfort ist. Ich habe gesehen, dass dies auf vielen Websites implementiert wurde, als Schlüssel ausgegeben wurden.
Außerdem lade ich alle tatsächlichen Sicherheitsexperten ein, diese Antwort zu kritisieren. Ich wollte dies nur als weiteren Diskussionspunkt herausbringen.