PostgreSQL数据库之密文密码检查(passwordcheck)

        PostgreSQL数据库用户密码管理涉及到MD5、SCRAM-SHA-256算法,根据配置文件postgresql.conf中的设置,新建用户的密码或者新修改的用户密码被使用上述算法加密后存储到表pg_authid中。准确的说,表pg_authid中存储的是密码的hash值,数据库服务器不保存任何明文或对称非对称加密后的用户密码密文,防止密码被窃取。

        passwordcheck插件是一个检查密码发杂度的postgresql数据库插件,用于检测新创建或新修改的用户密码复杂度。如果密码是以明文字符串的形式传送到数据库服务端的,那么密码复杂度很容易检查,无非就是对字符串的检查。但是,postgresql数据库允许以密文形式修改用户密码,也就是用户可以先把新密码加密(加密算法可选上面提到的算法),然后把加密后的密文传送到服务端,服务端接收到的是加密了的密码,又怎么进行密码复杂度检查呢?

        假设用户名为user1,再假设要把用户user1的密码修改为passwd1,那么

        1、如何修改用户密码?

        使用psql登录数据库服务器,执行修改命令:

postgres=# alter user user1 with password 'passwd1';
ERROR:  The password is too short
postgres=#

        2、如何以密文形式修改用户密码?       

        shell下使用md5sum工具加密字符串"passwd1user1" :

[postgres@localhost passwordcheck]$ echo -n passwd1user1 | md5sum
a9473571e79d0a48baa578d4f2564f8e  -
[postgres@localhost passwordcheck]$

        即把密码和用户名两个字符串连接起来,中间不加任何字符作为新字符串,计算其MD5值。然后在psql中执行修改密码命令:

postgres=# alter user user1 with password 'md5a9473571e79d0a48baa578d4f2564f8e';
ALTER ROLE
postgres=#

        注意上面修改密码的命令中,密码字符串是字符串"md5"+md5值的组合,此处缺少前头的三个字符md5将会修改失败。

        查看数据库系统存储的密码是不是我们上面给出的那一串“md5a9473571e79d0a48baa578d4f2564f8e”

postgres=# select rolname,rolpassword  from pg_authid where rolname='user1';
 rolname |             rolpassword
---------+-------------------------------------
 user1   | md5a9473571e79d0a48baa578d4f2564f8e
(1 row)

        3、如何检测密文形式的密码?

        因数据库服务器接收到的是加密后的密文,且是不可逆的hash算法加密的,所以服务器不可能获得密码明文,passwordchek仅仅检测新密码是否与用户名相同:

if (password_type != PASSWORD_TYPE_PLAINTEXT)
	{
		/*
		 * Unfortunately we cannot perform exhaustive checks on encrypted
		 * passwords - we are restricted to guessing. (Alternatively, we could
		 * insist on the password being presented non-encrypted, but that has
		 * its own security disadvantages.)
		 *
		 * We only check for username = password.
		 */
		char	   *logdetail;

		if (plain_crypt_verify(username, shadow_pass, username, &logdetail) == STATUS_OK)
			ereport(ERROR,
					(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
					 errmsg("password must not equal user name")));
	}

        plain_crypt_verify是数据库内核函数,用于用户登录认证时校验用户密码(非md5认证,是password认证,即pg_hba.conf中最后一列的认证方法为password,对应认证方法为md5\sm3\scram-sm3\scram-sha-256时的认证方式会在稍后的其他文章里讲到),其第一个参数是登录用户名,第二个参数是数据库本地存储的用户密码(表pg_authid),第三个参数是明文密码,此处取值为username即为:校验当密码为username时是否与数据库本地存储的密码一样。

        4、验证

        用用户名user1做用户user1的密码,计算其MD5值:

[postgres@localhost passwordcheck]$ echo -n user1user1 | md5sum
7d1b5a4329b6478e976508ab9a49ee3d  -
[postgres@localhost passwordcheck]$

        以密文形式修改密码:

postgres=# alter user user1 with password 'md57d1b5a4329b6478e976508ab9a49ee3d';
ERROR:  password must not equal user name
postgres=#

        passwordcheck阻止我修改密码,因为:ERROR:  password must not equal user name

        以上是修改密码为MD5形式密文时的检测,SCRAM-SHA-256其原理一样,只不过SCRAM-SHA-256引入了随机数,即便是修改的密码与上次完全一致,其存储在数据库系统表pg_authid中的密码密文也不一样,所以其安全性更高。

        参考:PostgreSQL学习之passwordcheck使用pam_cracklib-CSDN博客

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值