2016-08-15 70 views
0

我試圖通過使用觸發器在PostgreSQL數據庫中加密密碼,但我無法讓它工作,我不知道我的錯誤在哪裏。 下面是代碼:加密密碼觸發器

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 

我如何進入我插入,如果不是與NEW記錄:

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); 

它在執行的時候說,這?

+0

只使用散列函數是不夠的,只是添加一個鹽沒有提高安全性。取而代之的是用隨機鹽對HMAC進行大約100毫秒的持續時間並用散列表保存鹽。使用諸如password_hash,PBKDF2,Bcrypt和類似函數的函數。關鍵是要讓攻擊者花費大量時間通過強力查找密碼。 – zaph

+1

@RyanVincent哎呀,對不起我的錯誤,我不是故意處理你的評論,更正。 – zaph

+1

@Roberto Sanchez SHA1是一種加密散列函數,不是加密。哈希函數是單向函數,也就是說它不能恢復到它的輸入。加密操作系統是雙向的,有一個密鑰,加密的數據可以通過密鑰恢復到原始值。 – zaph

回答

0

安全和加密方面的考慮預留(見註釋),以解決您的實際PL/pgSQL的問題:

觸發功能基本正常。一些清理:

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 

但要使其工作,你必須做出觸發BEFORE INSERT

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

我建議手動herehere