oracle 如何在数据库中存储旧密码?

ddrv8njm  于 2023-01-12  发布在  Oracle
关注(0)|答案(3)|浏览(151)

我想存储6以前的密码,以便每当用户想改变密码,它首先验证与旧密码,并返回相应的。
如何存储旧密码而不添加任何新的列在数据库中。
任何参考资料(如可能)。

sqyvllje

sqyvllje1#

我认为您的问题的目标是验证密码没有被重复使用。因此,我建议:
使用字段IDTIMESTAMP和其他数据字段(如PASSWORD)创建附加历史表。

create table USER_HIST (ID varchar2(20), TIMESTAMP date, PASSWORD varchar2(20));

USER表上创建更新触发器,并在更改密码时在USER_HIST中插入一个条目。仅保留用户的最后六个条目。

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

用户更改密码时捕获异常。

vhmi4jdf

vhmi4jdf2#

您可以插入多行并选择最近的一行作为当前密码。为了验证,您可以检查较旧的密码历史记录,如下面的实现所示。
识别号 用户名密码订单日期DT
1 用户1 密码1 12/12/2015
2 用户1 密码2 13/12/2015
3 用户1 密码3 14/12/2015
这对于学校的项目来说是勉强可以的。但是,如果你正在计划一个生产级的代码,那么我建议你重新考虑你的数据库方法。也不要存储纯文本密码。使用salted hash代替。

klr1opcd

klr1opcd3#

存储密码的唯一方法是通过多轮散列的盐散列,其中BCrypt是最值得注意的。
如果你的数据库系统支持verify函数来测试新密码的哈希值,你就可以使用它,否则你必须从数据库中查询所有的bcrypt哈希值,然后通过java运行bcrypt_verify
但请不要永远在数据库中存储任何明文密码!!

相关问题