2016-08-15 65 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