如何在EDB PostgreSQL高级服务器数据库中实现密码验证功能

安全性是数据库在数据和用户级别的度量角色。最重要的安全问题之一是用户的密码,它应该是保密和复杂的。在本文中,我将解释并实现创建复杂密码验证函数的过程。配置文件功能在开源社区版本的PostgreSQL中不可用。然而,在EnterpriseDB(EDB)PostgreSQL Advanced Server中,有一个选项可以实现密码验证功能,该功能允许用户生成强大而复杂的密码。

什么是EDB?

EnterpriseDB(EDB)提供基于开源数据库PostgreSQL的软件和服务,是PostgreSQL最大的贡献者之一。EDB提供了灵活性,因为它提供了许多功能,可以帮助实现高可用性、灾难恢复、多主机复制、双向复制,甚至可以创建扩展的多个自定义选项。

数据库中角色功能的用途是什么?

角色充当模板,帮助为数据库用户分配权限。每个角色都有一组预定义的或自定义的特权,这些特权授予具有此角色的数据库用户帐户。您可以编辑与不同角色对应的权限集。

数据库中配置文件功能的用途是什么?

配置文件是一个数据库对象,可以帮助限制系统用户使用数据库,甚至限制用户执行超出合理资源利用率的操作。

什么是强制密码实践?

如何创建、重用和验证用户密码。

密码验证功能

密码验证函数值指定当用户将此配置文件登录到数据库时用于密码验证的PL/SQL函数。此函数可用于通过要求密码通过PL/SQL编写的强度测试来验证密码强度。

异常的复杂性检查

此函数用于验证密码字符串的复杂性。除了密码字符串之外,它还接受一些其他值来描述定义自定义密码的复杂性

验证功能。

chars–所有字符(即字符串长度)

字母–字母字符A-Z和A-Z

大写字母A-Z

小写字母a-z

数字–数字字符0-9

特殊–除双引号(密码分隔符)外,不在A-Z、A-Z和0-9中的所有字符

验证密码功能

它在EDB PostgreSQL中增强了密码复杂性。

例外–1:密码不包括用户名

异常–2:必须包含2个小写字母

异常–3:必须包含2个大写字母

异常-4:必须包含2位数字

异常–5:必须包含2个特殊字符

步骤1:创建验证密码的函数

edb=# CREATE OR REPLACE FUNCTION sys.verify_password(user_name varchar2, new_password varchar2, old_password varchar2)
edb-# RETURNS boolean IMMUTABLE
edb-#  LANGUAGE plpgsql
edb-# AS $function$
edb$# BEGIN
edb$#   IF (length(new_password) < 10)
edb$#   THEN
edb$#    -- raise_application_error(-20001, 'too short');
edb$#     RAISE EXCEPTION  'too short';
edb$#   END IF;
edb$#   IF  new_password= old_password
edb$#   THEN
edb$#    -- raise_application_error(-20002, 'includes old password');
edb$#     RAISE exception 'includes old password';
edb$#   END IF;
edb$#    IF substring(upper(new_password) FROM upper(user_name)) IS NOT NULL
edb$#   THEN
edb$#    -- raise_application_error(-20003, 'New passowrd not allowed to include username');
edb$#    RAISE exception 'New password not be allowed to contain username';
edb$#   END IF;
edb$#    IF (SELECT count(*)
edb$#      from regexp_matches(new_password,'[a-z]','g')   )<2
edb$#   THEN
edb$#    -- raise_application_error(-20004, 'Must be at least TWO lowercase character');
edb$#    RAISE exception 'Must be at least 2 lowercase characters';
edb$#   END IF;
edb$#    IF (SELECT count(*)
edb$#      from regexp_matches(new_password,'[A-Z]','g')   )<2
edb$#   THEN
edb$#    -- raise_application_error(-20005, 'Must be at least TWO uppercase character');
edb$#    RAISE exception 'Must be at least 2 uppercase characters';
edb$#   END IF;
edb$#   IF (SELECT count(*)
edb$#      from regexp_matches(new_password,'[0-9]','g')   )<2
edb$#   THEN
edb$#    -- raise_application_error(-20006, 'Must be at least TWO digit');
edb$#    RAISE exception 'Must be at least 2 digits';
edb$#   END IF;
edb$#   IF (SELECT count(*)
edb$#      from regexp_matches(new_password,'[^A-Za-z0-9]','g')   )<2
edb$#   THEN
edb$#    -- raise_application_error(-20006, 'Must be at least TWO special character');
edb$#     RAISE exception  'Must be at least 2 special characters';
edb$#   END IF;
edb$# return 1;
edb$# END;
edb$# $function$
edb-# ;
CREATE FUNCTION

步骤2:使用meta命令检查函数

edb=# \df sys.verify_password
                                                                List of functions
 Schema |      Name       | Result data type |                                     Argument data types                                     | Type
--------+-----------------+------------------+---------------------------------------------------------------------------------------------+------
 sys    | verify_password | boolean          | user_name character varying, new_password character varying, old_password character varying | func
(1 row)
edb=# \df+ sys.verify_password
List of functions
-[ RECORD 1 ]-------+--------------------------------------------------------------------------------------------
Schema              | sys
Name                | verify_password
Result data type    | boolean
Argument data types | user_name character varying, new_password character varying, old_password character varying
Type                | func
Volatility          | immutable
Parallel            | unsafe
Owner               | enterprisedb
Security            | invoker
Access privileges   |
Language            | plpgsql
Source code         |                                                                                            +
                    | BEGIN                                                                                      +
                    |   IF (length(new_password) < 10)                                                           +
                    |   THEN                                                                                     +
                    |    -- raise_application_error(-20001, 'too short');                                        +
                    |     RAISE EXCEPTION  'too short';                                                          +
                    |   END IF;                                                                                  +
                    |   IF  new_password= old_password                                                           +
                    |   THEN                                                                                     +
                    |    -- raise_application_error(-20002, 'includes old password');                            +
                    |     RAISE exception 'includes old password';                                               +
                    |   END IF;                                                                                  +
                    |    IF substring(upper(new_password) FROM upper(user_name)) IS NOT NULL                     +
                    |   THEN                                                                                     +
                    |    -- raise_application_error(-20003, 'New passowrd not allowed to include username');     +
                    |    RAISE exception 'New password not be allowed to contain username';                      +
                    |   END IF;                                                                                  +
                    |    IF (SELECT count(*)                                                                     +
                    |      from regexp_matches(new_password,'[a-z]','g')   )<2                                   +
                    |   THEN                                                                                     +
                    |    -- raise_application_error(-20004, 'Must be at least TWO lowercase character');         +
                    |    RAISE exception 'Must be at least 2 lowercase characters';                              +
                    |   END IF;                                                                                  +
                    |    IF (SELECT count(*)                                                                     +
                    |      from regexp_matches(new_password,'[A-Z]','g')   )<2                                   +
                    |   THEN                                                                                     +
                    |    -- raise_application_error(-20005, 'Must be at least TWO uppercase character');         +
                    |    RAISE exception 'Must be at least 2 uppercase characters';                              +
                    |   END IF;                                                                                  +
                    |   IF (SELECT count(*)                                                                      +
                    |      from regexp_matches(new_password,'[0-9]','g')   )<2                                   +
                    |   THEN                                                                                     +
                    |    -- raise_application_error(-20006, 'Must be at least TWO digit');                       +
                    |    RAISE exception 'Must be at least 2 digits';                                            +
                    |   END IF;                                                                                  +
                    |   IF (SELECT count(*)                                                                      +
                    |      from regexp_matches(new_password,'[^A-Za-z0-9]','g')   )<2                            +
                    |   THEN                                                                                     +
                    |    -- raise_application_error(-20006, 'Must be at least TWO special character');           +
                    |     RAISE exception  'Must be at least 2 special characters';                              +
                    |   END IF;                                                                                  +
                    | return 1;                                                                                  +
                    | END;                                                                                       +
                    |
Description         |

步骤3:创建配置文件

edb=# CREATE PROFILE EDB limit FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LIFE_TIME 90 PASSWORD_GRACE_TIME 3 PASSWORD_REUSE_TIME 180 PASSWORD_REUSE_MAX 5 PASSWORD_VERIFY_FUNCTION verify_password;
CREATE PROFILE

步骤4:让我们验证密码异常

edb=# create user athar password 'pythian' profile EDB;
ERROR:  too short
CONTEXT:  PL/pgSQL function verify_password(character varying,character varying,character varying) line 6 at RAISE    ====> Exception 1
edb=# create user athar password 'atharfahad' profile EDB;
ERROR:  New password not be allowed to contain username
CONTEXT:  PL/pgSQL function verify_password(character varying,character varying,character varying) line 16 at RAISE   =====> Exception 2
edb=# create user athar password 'pythiandbconsultant' profile EDB;
ERROR:  Must be at least 2 uppercase characters
CONTEXT:  PL/pgSQL function verify_password(character varying,character varying,character varying) line 28 at RAISE   =====> Exception 4
edb=# create user athar password 'PYthiandbconsultant' profile EDB;
ERROR:  Must be at least 2 digits
CONTEXT:  PL/pgSQL function verify_password(character varying,character varying,character varying) line 34 at RAISE   =====> Exception 5
edb=# create user athar password 'PYthiandbconsultant12' profile EDB;
ERROR:  Must be at least 2 special characters
CONTEXT:  PL/pgSQL function verify_password(character varying,character varying,character varying) line 40 at RAISE   =====> Exception 6
edb=# create user athar password 'PYthiandbconsultant12#$' profile EDB;    ==== Done all complex check
CREATE ROLE

我希望你觉得这篇文章有帮助。欢迎在评论区提出问题,并注册下一篇文章。

原文标题:HOW TO IMPLEMENT THE PASSWORD VERIFY FUNCTION IN A EDB POSTGRESQL ADVANCED SERVER DATABASE
原文作者:Athar Ishteyaque
原文链接:https://blog.pythian.com/password-verify-function-in-edb-postgresql-advanced-server-database/


免责声明:

1、本站资源由自动抓取工具收集整理于网络。

2、本站不承担由于内容的合法性及真实性所引起的一切争议和法律责任。

3、电子书、小说等仅供网友预览使用,书籍版权归作者或出版社所有。

4、如作者、出版社认为资源涉及侵权,请联系本站,本站将在收到通知书后尽快删除您认为侵权的作品。

5、如果您喜欢本资源,请您支持作者,购买正版内容。

6、资源失效,请下方留言,欢迎分享资源链接

文章评论

0条评论