首页 » ORACLE [C]系列, ORACLE 9i-23c » Oracle12c-19c如何防止安全检查查出弱密码?

Oracle12c-19c如何防止安全检查查出弱密码?

ORACLE数据库在安全方面可靠度绝对完善,包括数据库用户的密码加密,在之前的老版本中如10G及以前,密码在dba_user.password显示密文, 由于使用的是DES加密,很容易从网上找到解密密文的方法,可以现在都12C–19C了,之前分享过《Oracle 12c 关于密码(password)的几个新特性小结》都已经引入了新的密码hash算法,怎么还经常能收到安全检查提示数据库用户有弱密码? 他们还能解密12c以后的PBKDF2的SHA512哈希算法? 那也太牛了吧,经常让DBA去改弱密码,DBA不能忍,于是研究一下怎么回事。

从安全提供12c数据库中个人用户密码的密文发现是类似“FC110DD5268B2BB5“这种短值,不应该呀,从哪取到的?USER$.password列。从11g以后密码区分大小写的值就已经存在了user$.spare4,但是为了向前兼容,在user$.password列还有以前老版本的不区分大小写密文。安全室就是从USER$.password列取到的值做的解密, 如果让他取不到这个值,自然也就解不了密。

到12c了为什么user$.password 有的数据库环境还有值?而有的没有? 是因为有些数据库为了应用或数据库客户端向低版本兼容,在$ORACLE_HOME/netword/admin/sqlnet.ora中的SQLNET.ALLOWED_LOGON_VERSION_SERVER 配置了如8等值,这个问题我在<升级12C注意事项: 连接失败 ORA-28040 ORA-1017提到过。

如果我们的客户端11.2.0.3以上,则没有必要配置低于version 12的值, 下面测试不同version对于user$.password的影响。

测试版本Oracle 19.3

[oracle@zcloud ~]$ for i in 8 9 10 11 12 12a; do 
> echo "change version $i ..."
> echo "SQLNET.ALLOWED_LOGON_VERSION_SERVER="$i > $ORACLE_HOME/network/admin/sqlnet.ora;  
> sqlplus -s / as sysdba< create user c##anbob$i identified by anbob1;
> exit;
> EOF
> done;
change version 8 ...

User created.

change version 9 ...

User created.

change version 10 ...

User created.

change version 11 ...

User created.

change version 12 ...

User created.

change version 12a ...

User created.


SQL> col name for a30
SQL> col password for a50
SQL> col password_ver for a30
SQL> 
SQL> select      decode(bitand(u.spare1, 65536), 65536, NULL, decode(
  2         REGEXP_INSTR(
  3           NVL2(u.password, u.password, ' '),
  4           '^                $'
  5         ),
  6         0,
  7         decode(length(u.password), 16, '10G ', NULL),
  8         ''
  9       ) ||
 10       decode(
 11         REGEXP_INSTR(
 12           REGEXP_REPLACE(
 13             NVL2(u.spare4, u.spare4, ' '),
 14             'S:000000000000000000000000000000000000000000000000000000000000',
 15             'not_a_verifier'
 16           ),
 17           'S:'
 18         ),
 19         0, '', '11G '
 20       ) ||
 21       decode(
 22         REGEXP_INSTR(
 23           NVL2(u.spare4, u.spare4, ' '),
 24           'T:'
 25         ),
 26         0, '', '12C '
 27       ) ||
 28       decode(
 29         REGEXP_INSTR(
 30           REGEXP_REPLACE(
 31             NVL2(u.spare4, u.spare4, ' '),
 32             'H:00000000000000000000000000000000',
 33             'not_a_verifier'
 34           ),
 35           'H:'
 36         ),
 37         0, '', 'HTTP '
 38       )) password_ver,name,password  from user$ u where name like 'C##ANBOB%';

PASSWORD_VER                   NAME                           PASSWORD
------------------------------ ------------------------------ --------------------------------------------------
10G 11G 12C                    C##ANBOB10                     0852D701E1A4619C
10G 11G 12C                    C##ANBOB11                     298571205D180182
11G 12C                        C##ANBOB12
12C                            C##ANBOB12A
10G 11G 12C                    C##ANBOB8                      AC6D78B1D13E979E
10G 11G 12C                    C##ANBOB9                      9DDA94FCEAA503BA

Note:
当SQLNET.ALLOWED_LOGON_VERSION_SERVER在12及12A时,user$.password列就不再有值。

Note: 本文的目的当然不是为了掩耳盗铃, 有些弱密码还是不建议使用,数据库也有自带的verify_function可以做为最基本的验证,我们也有自定义该方法,修改时过滤弱密码表,也是一种不错的方法。

打赏

对不起,这篇文章暂时关闭评论。