安全性是数据库在数据和用户级别的度量角色。最重要的安全问题之一是用户的密码,它应该是保密和复杂的。在本文中,我将解释并实现创建复杂密码验证函数的过程。配置文件功能在开源社区版本的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/