【问题标题】:Regular expression for password with at least two uppercase and two lowercase letters in OracleOracle中至少有两个大写和两个小写字母的密码正则表达式
【发布时间】:2021-02-18 21:48:38
【问题描述】:

我在 oracle 18 xe 中为我的数据库执行约束时遇到问题,

我需要的是密码有

  • 至少 5 个字符
  • 至少两个大写字母
  • 至少两个小写字母
  • 至少一位数

我已经做了足够多的搜索,但找不到正确的方式,到目前为止我都穿这个

ALTER TABLE USER 
ADD CONSTRAINT  PASSWORD_CHECK
REGEXP_LIKE(PASSWORD, '^.*[0-9]', 'c')
AND REGEXP_LIKE(PASSWORD, '^.*[A-Z]{2,}', 'c');
AND REGEXP_LIKE(PASSWORD, '^.*[a-z]{2,}', 'c');
AND REGEXP_LIKE(PASSWORD, '^[a-zA-Z0-9]{5,}$', 'c');

感谢您的支持!

【问题讨论】:

  • 如果您这样做是为了学习在数据库中使用 Regexp,那很好,但不要存储密码或将密码按原样发送到数据库,请考虑在 UI 中对密码进行哈希处理,并且仅通过网络发送散列值以存储在您的数据库中,在用户输入时应用验证规则。
  • 自动否决将用户密码存储为明文。这就是人们被黑客入侵的方式。即使您的问题只是针对作业,您也需要了解这是一种可怕的、不道德的编码实践。至少,使用STANDARD_HASH 之类的东西而不是纯文本。

标签: sql oracle oracle18c oracle-xe-18.4


【解决方案1】:

唉,如果 Oracle 的正则表达式引擎支持前瞻,您可以只使用一个模式:

^(?=.*[A-Z].*[A-Z])(?=.*[a-z].*[a-z])(?=.*[0-9]).{5,}$

但是,它不支持环视,所以我们几乎坚持使用您当前的方法。您当前的模式有一些小问题,而且REGEXP_LIKE 可以与部分匹配一起使用,因此在大多数情况下不需要^$ 锚点。考虑这个版本:

ALTER TABLE USER 
ADD CONSTRAINT  PASSWORD_CHECK
REGEXP_LIKE(PASSWORD, '[0-9]', 'c')                   -- 1+ digits
AND REGEXP_LIKE(PASSWORD, '[A-Z].*[A-Z]', 'c');       -- 2+ uppers
AND REGEXP_LIKE(PASSWORD, '[a-z].*[a-z]', 'c');       -- 2+ lowers
AND REGEXP_LIKE(PASSWORD, '^[a-zA-Z0-9]{5,}$', 'c');  -- length >= 5

如果您没有密码只能是数字和字母的限制,那么您可以将最后的条件替换为:

LENGTH(PASSWORD) >= 5

【讨论】:

    【解决方案2】:

    您可以在PASSWORD 列上使用NOT NULLCHECK 约束,如下所示:

    CREATE TABLE USERS (PASSWORD VARCHAR2(10) NOT NULL); -- NOT NULL
    
    ALTER TABLE USERS ADD CONSTRAINT PASSWORD_CHECK
    CHECK (REGEXP_COUNT(PASSWORD, '[0-9]') >= 1      -- 1 digit
           AND REGEXP_COUNT(PASSWORD, '[A-Z]') >= 2  -- 2 or more uppercase characters    
           AND REGEXP_COUNT(PASSWORD, '[a-z]') >= 2  -- 2 or more lowercase characters         
           AND LENGTH(PASSWORD) >= 5);               -- minimum length must be 5
    

    PASSWORD 列上的NOT NULL 约束将是必需的,因为CHECK 约束不会应用于NULL 值,并且如果NOT NULL 约束在未创建列。

    【讨论】:

      猜你喜欢
      • 2019-11-09
      • 1970-01-01
      • 2020-12-06
      • 2016-10-06
      • 2013-02-14
      • 2016-12-14
      • 2021-04-21
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多