2016-08-15 5 views
0

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?

+0

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

+1

@RyanVincent Ups, tut mir leid, mein Fehler, ich wollte nicht den Kommentar an Sie gerichtet, korrigiert. – zaph

+1

@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

Antwort

0

Sicherheit und Kryptographie-Überlegungen beiseite (siehe Kommentare), Ihre tatsächliche PL/pgSQL Frage zu beantworten:

Die Triggerfunktion grundsätzlich in Ordnung ist. Einige Bereinigung:

CREATE FUNCTION encrypt_password() 
    RETURNS TRIGGER AS 
$func$ 
BEGIN 
NEW.passwd := digest(NEW.passwd, 'sha1'); -- or some other function? 
RETURN NEW; 
END 
$func$ LANGUAGE plpgsql; -- don't quote the language name 

Aber es funktioniert, müssen Sie den Auslöser machen BEFORE INSERT:

CREATE TRIGGER encrypt_userdata 
BEFORE INSERT ON mms_user 
EXECUTE PROCEDURE encrypt_password(); 

Ich schlage vor, das Handbuch here und here.

Verwandte Themen