1. 背景
一项目现场ogg割接oracle由aix 11.2.0.4到linux 11.2.0.4之后,引发程序连接oracle ORA-01017: invalid username/password; logon denied,但是用户名密码配置割接前后并无改动
经测试,相同的用户名密码,本地sqlplus可以连接,程序无法连接,怀疑是连接工具会自动将密码转为大写/小写,
可以将参数sec_case_sensitive_logon设置为false来避免ORA-01017错
后检查aix原库发现sec_case_sensitive_logon是false,更加证实了猜想
2. sec_case_sensitive_logon介绍
11g之前建立的用户,密码不区分大小写,即使用双引号强制
11g之后出现了sec_case_sensitive_logon参数,可以设置密码大小写是否忽略(true:大小写敏感,false:大小写不敏感)
默认为true
改为false测试
alter system set sec_case_sensitive_logon=false scope=both;
sec_case_sensitive_logon=false时数据库中存储的密码是否区分大小写?
在false时重置密码,改为true时发现存储密码按实际的大小写字符存储
3. 10g升级到11g
如果10g dbua或者迁移到11g,如果程序端设置的密码没有明确区分大小写,但是默认11g是区分大小写的,故可以将alter system set sec_case_sensitive_logon=false scope=both;来解决
11g还引入了密码延迟验证的特性
如果一个用户用错误的密码试图连接oracle,会导致验证的时间越来越长
从第三次密码错误的登录开始,每次延迟时间开始变成2秒、3秒并一次递增。既是这时提供正确的密码登录,会话也会延迟N秒,然后进行验证。不过一旦验证成功,会将失败计数清零,后续的错误登录会重新计数
如果同时存在两个会话,则很快延迟验证时间就会达到10秒、20秒的级别。如果同时大量的连接采用错误的密码,基本上这个用户的登录就会被完全HANG住
可以如下设置关闭密码延迟特性
ALTER SYSTEM SET EVENT = '28401 TRACE NAME CONTEXT FOREVER, LEVEL 1' SCOPE = SPFILE
或者也可以设置用户的密码PASSWORD_LOCK_TIME来锁定用户
4. 18c和sec_case_sensitive_logon
18c以后已经弃用了sec_case_sensitive_logon,但是为了向前兼容,还是保留了此参数
并且oracle建议保留sec_case_sensitive_logon的默认值true,不要修改
如果使用dbua升级,oracle建议检查此参数,并确保它是true
sharding环境修改sec_case_sensitive_logon为false,导致gsm sync database时报ORA-01017错误