Ich habe versucht, ein Passwort in einer PostgreSQL-Datenbank mit einem Trigger zu verschlüsseln, aber ich kann es nicht zum Laufen bringen, und ich weiß nicht, wo mein Fehler ist. Hier ist der Code:Passwort verschlüsseln Trigger
CREATE TABLE mms_user (
uid serial,
mail text NOT NULL,
passwd text NOT NULL,
usertype integer NOT NULL,
PRIMARY KEY (uid)
);
CREATE FUNCTION encrypt_password() RETURNS TRIGGER AS $$
BEGIN
NEW.passwd = digest(NEW.passwd, 'sha1');
RETURN NEW; END; $$LANGUAGE 'plpgsql';
CREATE TRIGGER encrypt_userdata AFTER INSERT ON mms_user EXECUTE PROCEDURE encrypt_password();
INSERT INTO mms_user values (default, 'who', 'me', 1);
Es sagt dies bei der Ausführung:
ERROR: record "new" is not assigned yet DETAIL: The tuple structure of a not-yet-assigned record is indeterminate. CONTEXT: PL/pgSQL function encrypt_password() line 3 at assignment
Wie greife ich auf die Platte, die ich eingefügt werde, wenn es nicht mit NEW
ist?
Die Verwendung einer Hash-Funktion ist nicht ausreichend und nur das Hinzufügen eines Salzes trägt wenig zur Verbesserung der Sicherheit bei. Stattdessen iterieren Sie über einen HMAC mit einem zufälligen Salz für etwa 100ms und speichern Sie das Salz mit dem Hash. Verwenden Sie Funktionen wie password_hash, PBKDF2, Bcrypt und ähnliche Funktionen. Es geht darum, den Angreifer dazu zu bringen, viel Zeit mit der Suche nach Passwörtern zu verbringen. – zaph
@RyanVincent Ups, tut mir leid, mein Fehler, ich wollte nicht den Kommentar an Sie gerichtet, korrigiert. – zaph
@Roberto Sanchez SHA1 ist eine kryptografische Hash-Funktion, keine Verschlüsselung. Eine Hash-Funktion ist unidirektional, dh sie kann nicht auf ihre Eingabe zurückgesetzt werden. Verschlüsselung zwei-Wege, gibt es einen Schlüssel und mit dem Schlüssel können die verschlüsselten Daten auf ihren ursprünglichen Wert zurückgesetzt werden. – zaph