Sicherer MySQL-Zufallsstringgenerator
-
29-09-2020 - |
Frage
Ich möchte eine kryptografisch sichere Zeichenfolge zum Zurücksetzen des Passworts in MySQL generieren.Ich weiß, dass ich dies auf Anwendungsebene in PHP tun könnte;Dafür ist jedoch die OpenSSL-Erweiterung erforderlich, die viele meiner Kunden möglicherweise nicht haben.
Wenn ich es in MySQL 5 auf sichere und allgemein verfügbare Weise tun könnte, wäre das ideal.Ist das möglich?
Notiz:Dies dient der Generierung eines sicheren Tokens zum Zurücksetzen des Passworts.Es hat nichts mit einer sicheren Verbindung zu tun, daher ist die Verwendung von https keine Lösung.
Lösung
Da sind viele Verschlüsselung Methoden, die in MySQL verfügbar sind.
Wenn Sie eine Zwei-Wege-Verschlüsselung benötigen, können Sie diese verwenden aes_encrypt
welches das dazugehörige hat aes_decrypt
Wenn Sie nur einen sicheren Hash benötigen, können Sie ihn verwenden sha2
Die folgende Anweisung könnte zu einem ähnlichen Ergebnis führen openssl_random_pseudo_bytes
SELECT HEX(SHA2(CONCAT(NOW(), RAND(), UUID()), 512));
Die obige Aussage gilt NOW()
und verkettet es mit RAND()
und ein UUID()
, führt dann ein 512-Bit aus SHA2()
Verschlüsselung des Ergebnisses und konvertiert es dann in HEX()
Andere Tipps
Dies ist MySQLs Zufallszahlengenerator:
generasacodicetagpre.Sie müssen einen großen Zufallswert von außen weitergeben.Sagen Sie, dass Sie eine 512-Bit-Zufallszahl benötigen, die eindeutig ist.Dies kann ausreichen:
generasacodicetagpre.sagen, dass Gibberish512 ein ARG zu einer gespeicherten Prozedur ist, die Rand auf viele Werte anruft, alle innerhalb einiger Millisekunden, und ein Zeitstempel gibt, wenn das war.MySQL Rand () hat weniger als 64 Bit von der Entropie allein.ein zufälliges Argument von außen übergeben (erzeugt aus zufälligen Tippen, Würfelrollen oder einem ordnungsgemäßen Kryptorandom PRNG usw.).
BEGIN
declare r tinytext;
declare s tinytext default '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
declare n int;
set r='';
while length(r)<=16 do
set n=rand() * 61;
set r=concat(r,substr(s,n,1));
end while;
select r;
END