与前一个密码有 3 个不同字符的密码 - PL/SQL

Posted

技术标签:

【中文标题】与前一个密码有 3 个不同字符的密码 - PL/SQL【英文标题】:Password with 3 different characters from the previous password - PL/SQL 【发布时间】:2019-11-27 22:17:13 【问题描述】:

所以我的任务包括一个与 PL/SQL 中的前一个密码不同的 3 个字符的密码。 代码如下:

IF old_password IS NOT NULL THEN
     differ := length(old_password) - length(password);

     differ := abs(differ);

       IF length(password) < length(old_password) THEN
         m := length(password);
       ELSE
         m := length(old_password);
       END IF;

       FOR i IN 1..m LOOP
         IF substr(password,i,1) != substr(old_password,i,1) THEN
           differ := differ + 1;
         END IF;
       END LOOP;

       IF differ < 3 THEN
         raise_application_error(-20011, 'Password should differ from the \
            old password by at least 3 characters');
       END IF;

   END IF;
   -- Everything is fine; return TRUE ;   
   RETURN(TRUE);

如果我的旧密码是“aaa”,而我将其更改为“aaa222”,则会出现错误。没关系。

但是如果我的旧密码是“aaa”并且我将其更改为“aaa2222”,它不会给我一个错误,我不知道为什么。这应该给我一个错误..

怎么了?有什么解决办法吗?

【问题讨论】:

aa1aaaa2 怎么样?它应该返回什么以及为什么? 当我使用“aaa”作为旧密码和“aaa222”作为新密码运行您的代码时,它成功完成(即没有错误)。 ??? db<>fiddle here 它应该返回一个错误,因为它必须与以前的密码有 3 个不同的字符。在这种情况下,只有“2”不同。但是这段代码有问题,因为它成功完成了 您首先检查长度是否不同。使用'aaa' 作为旧密码,'aaa222' 作为新密码。长度差为 3,因此您永远不会进入以IF differ &lt; 3 THEN 开头的块。也许您想要做的是创建每个密码中唯一字符的集合,然后进行比较。 我消除了“IF different 【参考方案1】:

从您发布的代码来看,您的结果没有意义,我认为您发布的代码中有错字(请参阅下面的我的 cmets),但让我们分析一下代码实际在做什么。

明显

IF old_password IS NOT NULL THEN

在第一种情况下,这两行将差异设置为 3,将第二种情况设置为 4,因为字符串的长度不同

differ := length(old_password) - length(password);
differ := abs(differ);

此块在任何一种情况下都会选择两个密码中较短的一个,因此在两种情况下都会返回 3(aaa 的初始密码)

IF length(password) < length(old_password) THEN
   m := length(password);
ELSE
   m := length(old_password);
END IF;

您遍历短密码的长度,并将其与长密码逐个字符进行比较,前三个字符都是 aaa,因此匹配,这样您就不会进入 if 语句

   FOR i IN 1..m LOOP
     IF substr(password,i,1) != substr(old_password,i,1) THEN
       differ := differ + 1;
     END IF;
   END LOOP;

在您的第一种情况下,差异将是 3,而在您的第二种情况下,则为 4,因此除非您有

   IF differ < 3 THEN
     raise_application_error(-20011, 'Password should differ from the \
        old password by at least 3 characters');
   END IF;
END IF;

在两种情况下都返回 true。

-- Everything is fine; return TRUE ;   
RETURN(TRUE);

【讨论】:

以上是关于与前一个密码有 3 个不同字符的密码 - PL/SQL的主要内容,如果未能解决你的问题,请参考以下文章

验证密码强度是否符合要求

注册填写密码,最小长度为6个字符是啥

在 PHP 中匹配 128 个字符的密码哈希 - 使用 Ruby on Rails 加密

带有特殊字符的java密码检查器

关于密码安全

python实现华为OD机试真题最长的密码2022 Q4 | 100分