create or replace trigger "PASSWORD_CHANGE"
before update on USER_TB
for each row
begin
if :new.password <> :old.password then
delete USER_HIST h where h.ID = :old.ID and h.TIMESTAMP =
(select min(TIMESTAMP) from user_hist u where u.ID = :old.ID
having count(*) >= 6);
insert into USER_HIST (ID, TIMESTAMP, PASSWORD) values
(:old.ID, sysdate, :old.PASSWORD);
end if;
end;
在历史记录表上添加一个约束,以验证以前从未使用过该密码。
alter table USER_HIST add constraint pwd_is_not_reused UNIQUE (ID, PASSWORD);
3条答案
按热度按时间sqyvllje1#
我认为您的问题的目标是验证密码没有被重复使用。因此,我建议:
使用字段
ID
、TIMESTAMP
和其他数据字段(如PASSWORD
)创建附加历史表。在
USER
表上创建更新触发器,并在更改密码时在USER_HIST
中插入一个条目。仅保留用户的最后六个条目。在历史记录表上添加一个约束,以验证以前从未使用过该密码。
用户更改密码时捕获异常。
vhmi4jdf2#
您可以插入多行并选择最近的一行作为当前密码。为了验证,您可以检查较旧的密码历史记录,如下面的实现所示。
识别号 用户名密码订单日期DT
1 用户1 密码1 12/12/2015
2 用户1 密码2 13/12/2015
3 用户1 密码3 14/12/2015
这对于学校的项目来说是勉强可以的。但是,如果你正在计划一个生产级的代码,那么我建议你重新考虑你的数据库方法。也不要存储纯文本密码。使用
salted hash
代替。klr1opcd3#
存储密码的唯一方法是通过多轮散列的盐散列,其中BCrypt是最值得注意的。
如果你的数据库系统支持verify函数来测试新密码的哈希值,你就可以使用它,否则你必须从数据库中查询所有的bcrypt哈希值,然后通过java运行
bcrypt_verify
。但请不要永远在数据库中存储任何明文密码!!