Oracle 19c的参数sec_case_sensitive_logon与ORA-01017错误
Posted on 2025-02-19 22:28 dclogs 阅读(3) 评论(0) 编辑 收藏 举报转自:https://www.cnblogs.com/kerrycode/p/17354780.html
Oracle的参数sec_case_sensitive_logon是Oracle 11g开始被引入。这个参数主要是为了控制密码的大小写敏感问题。
sec_case_sensitive_logon=true表示密码区分大小写。
sec_case_sensitive_logon=false表示密码不区分大小写。
从Oracle 12c开始,参数sec_case_sensitive_logon被弃用了。但是为了向下兼容,即使在Oracle 19c中,这个参数依然保留了。这个参数在Oracle 12c(确切的说是12.2以及后续版本)和19c中不能设置为false,因为它和SQLNET.ALLOWED_LOGON_VERSION_SERVER=12或者SQLNET.ALLOWED_LOGON_VERSION_SERVER=12a不兼容。这是因为用于此模式的更安全的密码版本仅支持区分大小写的密码检查。简单点来说,就是这种环境下,这种设置会冲突。官方文档[1]的阐述如下所示:
Note the following implications of setting the value to 12 or 12a: • A value of FALSE for the SEC_CASE_SENSITIVE_LOGON Oracle instance initialization parameter must not be used because password case insensitivity requires the use of the 10G password version. If the SEC_CASE_SENSITIVE_LOGON Oracle instance initialization parameter is set to FALSE, then user accounts and secure roles become unusable because Exclusive Mode excludes the use of the 10G password version. The SEC_CASE_SENSITIVE_LOGON Oracle instance initialization parameter enables or disables password case sensitivity. However, since Exclusive mode is enabled by default in this release, disabling the password case sensitivity is not supported. Note: • The use of the Oracle instance initialization parameter SEC_CASE_SENSITIVE_LOGON is deprecated in favor of setting the SQLNET.ALLOWED_LOGON_VERSION_SERVER parameter to 12 to ensure that passwords are treated in a case-sensitive fashion. • Disabling password case sensitivity is not supported in Exclusive mode (when SQLNET.ALLOWED_LOGON_VERSION_SERVER is set to 12 or 12a.) • Releases of OCI clients earlier than Oracle Database 10g cannot authenticate to the Oracle database using password-based authentication. • If the client uses Oracle Database 10g, then the client will receive an ORA-03134: Connections to this server version are no longer supported error message. To allow the connection, set the SQLNET.ALLOWED_LOGON_VERSION_SERVER value to 8. Ensure the DBA_USERS.PASSWORD_VERSIONS value for the account contains the value 10G. It may be necessary to reset the password for that account.
如果 SQLNET.ALLOWED_LOGON_VERSION_SERVER 参数设置为 12 或 12a,请确保 SEC_CASE_SENSITIVE_LOGON 参数未设置为 FALSE。这是因为用于此模式的更安全的密码版本仅支持区分大小写的密码检查。
出于兼容性原因,当 SQLNET.ALLOWED_LOGON_VERSION_SERVER 设置为 12 或 12a 时,Oracle 数据库不会阻止对 SEC_CASE_SENSITIVE_LOGON 使用 FALSE。
当 SQLNET.ALLOWED_LOGON_VERSION_SERVER 设置为 12 或 12a 时,将 SEC_CASE_SENSITIVE_LOGON 设置为 FALSE 会导致所有帐户无法访问。
如果 SQLNET.ALLOWED_LOGON_VERSION_SERVER 设置为 11 或更低的值,那么 Oracle 建议您将 SEC_CASE_SENSITIVE_LOGON 设置为 TRUE,因为在 Oracle Database 12c 中独占模式下使用的更安全的密码版本(当 SQLNET.ALLOWED_LOGON_VERSION_SERVER 为 12 或 12a 时)不区分大小写的密码匹配。
从密码版本看,需要密码版本包含10G。
是的,密码也是有版本的,视图dba_users就有字段password_versions可以查询。
密码版本的值有10G,11G,12C,由SQLNET.ALLOWED_LOGON_VERSION_SERVER控制。
10G
指早期不区分大小写的 Oracle 密码版本,11G
指基于 SHA-1 的密码版本,12C
指基于 SHA-2 的 SHA-512 密码版本。
注意密码版本和平时说的DataBase版本不是一个概念。
需要在数据库版本12C以后不区分密码大小写,即sec_case_sensitive_logon=false生效,需要使得用户的密码版本包含10G这个身份验证协议。
前边提到过,密码版本通过SQLNET.ALLOWED_LOGON_VERSION_SERVER控制,下边是SQLNET.ALLOWED_LOGON_VERSION_SERVER的值对Password Version的影响表:
SQLNET.ALLOWED_LOGON_VERSION_SERVER设置 | 8 | 11 | 12 | 12a |
---|---|---|---|---|
服务器以独占模式运行? |
不 |
不 |
是的 |
是的 |
生成10G密码版本? |
是的 |
是的 |
不 |
不 |
生成11G密码版本? |
是的 |
是的 |
是的 |
不 |
生成12C密码版本? |
是的 |
是的 |
是的 |
是的 |
这里引用Oracle19C官方文档的一段话:原文点击这里
默认情况下,Oracle 数据库使用不允许不区分大小写的密码的独占模式来管理密码版本。
在默认安装中,该
SQLNET.ALLOWED_LOGON_VERSION_SERVER
参数设置12
为启用独占模式。独占模式要求基于密码的身份验证协议对要进行身份验证的帐户使用区分大小写的密码版本 (11G
或12C
) 之一。独占模式不使用
10G
早期版本中使用的密码版本。升级到 Oracle Database 12 c 第2 版 (12.2) 后,使用10G
密码版本的帐户将无法访问。出现这种情况是因为服务器默认以独占模式运行,独占模式无法使用旧10G
密码版本对客户端进行身份验证。服务器没有用于验证客户端的密码版本。版本 10 g 中的用户帐户使用
10G
密码版本。因此,您应该找到使用10G
密码版本的用户帐户,然后为这些帐户重置密码。这将根据SQLNET.ALLOWED_LOGON_VERSION_SERVER
参数的设置生成适当的密码版本,如下所示:
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
产生这三个密码版本10G
,11G
和12C
。
SQLNET.ALLOWED_LOGON_VERSION_SERVER=12
生成11G
和12C
密码版本,并删除10G
密码版本。
SQLNET.ALLOWED_LOGON_VERSION_SERVER=12a
仅生成12C
密码版本。
下面我们来构造一个例子,看看这个参数sec_case_sensitive_logon的影响
SQL> select banner_full from v$version; BANNER_FULL ---------------------------------------------------------------------------------------------------- Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 1 row selected. SQL> show parameter sec_case_sensitive_logon; NAME TYPE VALUE -------------------------- ----------- ------------------------------ sec_case_sensitive_logon boolean TRUE SQL> alter user system identified by "system#1245"; User altered. SQL> SET LINESIZE 1080; SQL> SET PAGESIZE 36; SQL> COL USERNAME FOR A24; SQL> COL ACCOUNT_STATUS FOR A16; SQL> COL DEFAULT_TABLESPACE FOR A16; SQL> COL TEMPORARY_TABLESPACE FOR A10; SQL> COL PROFILE FOR A10; SQL> COL LOCK_DATE FOR A20; SQL> COL EXPIRY_DATE FOR A20; SQL> COL PASSWORD_VERSIONS FOR A12; SQL> SELECT USERNAME 2 , ACCOUNT_STATUS 3 , DEFAULT_TABLESPACE 4 , TEMPORARY_TABLESPACE 5 , PROFILE 6 , TO_CHAR(LOCK_DATE,'YYYY-MM-DD HH24:MI:SS') AS LOCK_DATE 7 , TO_CHAR(EXPIRY_DATE,'YYYY-MM-DD HH24:MI:SS') AS EXPIRY_DATE 8 , PASSWORD_VERSIONS 9 FROM DBA_USERS 10 WHERE USERNAME=UPPER('&USERNAME') 11 ORDER BY EXPIRY_DATE; Enter value for username: system old 10: WHERE USERNAME=UPPER('&USERNAME') new 10: WHERE USERNAME=UPPER('system') USERNAME ACCOUNT_STATUS DEFAULT_TABLESPA TEMPORARY_ PROFILE LOCK_DATE EXPIRY_DATE PASSWORD_VER ---------- ---------------- ---------------- ---------- ---------- --------------- -------------------- ------------ SYSTEM OPEN SYSTEM TEMP DEFAULT 2023-10-22 17:25:09 11G 12C SQL> alter system set sec_case_sensitive_logon=false scope=both; System altered. SQL>
然后我们在另外一个窗口使用system账号登陆数据库
$ sqlplus system/system#1245 SQL*Plus: Release 19.0.0.0.0 - Production on Tue Apr 25 17:16:28 2023 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. ERROR: ORA-01017: invalid username/password; logon denied
如果我们将参数设置sec_case_sensitive_logon为true(这个参数调整后可以立即生效,不用重启),
SQL> show user; USER is "SYS" SQL> alter system set sec_case_sensitive_logon=true scope=both; System altered. SQL>
然后验证如下所示所示,一切正常,所以如果你遇到ORA-01017这个错误,而且数据库版本为12c/19c,如果你确认你密码是正确的,那么检查一下这个参数。
$sqlplus system/system#1245 SQL*Plus: Release 19.0.0.0.0 - Production on Tue Apr 25 17:20:28 2023 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Last Successful login time: Tue Apr 25 2023 09:54:37 +08:00 Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL>
下面我们再来测试一下,在参数sec_case_sensitive_logon为false的情况,我们控制密码版本来解决ORA-01017这个错误
SQL> show user; USER is "SYS" SQL> show parameter sec_case_sensitive_logon; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ sec_case_sensitive_logon boolean FALSE SQL>
修改sqlnet.ora这个参数文件,设置下面参数:
SQLNET.ALLOWED_LOGON_VERSION_CLIENT = 10 SQLNET.ALLOWED_LOGON_VERSION_SERVER = 10
修改sqlnet.ora参数文件后,必须重新登陆SQLPlus后(如果使用之前的SQLPlus连接也不会生效),执行下面脚本
SQL> alter user system identified by "system#1245"; User altered. SQL> SET LINESIZE 1080; SQL> SET PAGESIZE 36; SQL> COL USERNAME FOR A16; SQL> COL ACCOUNT_STATUS FOR A16; SQL> COL DEFAULT_TABLESPACE FOR A16; SQL> COL TEMPORARY_TABLESPACE FOR A10; SQL> COL PROFILE FOR A10; SQL> COL LOCK_DATE FOR A20; SQL> COL EXPIRY_DATE FOR A20; SQL> COL PASSWORD_VERSIONS FOR A12; SQL> SELECT USERNAME 2 , ACCOUNT_STATUS 3 , DEFAULT_TABLESPACE 4 , TEMPORARY_TABLESPACE 5 , PROFILE 6 , TO_CHAR(LOCK_DATE,'YYYY-MM-DD HH24:MI:SS') AS LOCK_DATE 7 , TO_CHAR(EXPIRY_DATE,'YYYY-MM-DD HH24:MI:SS') AS EXPIRY_DATE 8 , PASSWORD_VERSIONS 9 FROM DBA_USERS 10 WHERE USERNAME=UPPER('&USERNAME') 11 ORDER BY EXPIRY_DATE; Enter value for username: system old 10: WHERE USERNAME=UPPER('&USERNAME') new 10: WHERE USERNAME=UPPER('system') USERNAME ACCOUNT_STATUS DEFAULT_TABLESPA TEMPORARY_ PROFILE LOCK_DATE EXPIRY_DATE PASSWORD_VER ---------------- ---------------- ---------------- ---------- ---------- -------------------- -------------------- ------------ SYSTEM OPEN SYSTEM TEMP DEFAULT 2023-10-23 09:21:27 10G 11G 12C 1 row selected. SQL>
此时验证system账号登陆,则不会报ORA-01017这个错误了。
$ sqlplus system/system#1245 SQL*Plus: Release 19.0.0.0.0 - Production on Wed Apr 26 09:22:18 2023 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Last Successful login time: Tue Apr 25 2023 17:20:29 +08:00 Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL>
注意:最好使用其他账号验证测试,这里仅仅是为了偷懒,使用测试环境的system账号测试验证。更多相关信息也可以参考The new Exclusive Mode default for password-based authentication in Oracle 12.2 conflicts with case-insensitive password configurations. All user login fails with ORA-1017 after upgrade to 12.2 (Doc ID 2075401.1)[2]
参考资料
官方文档1: https://docs.oracle.com/en/database/oracle/oracle-database/19/netrf/parameters-for-the-sqlnet.ora.html#GUID-1FA9D26C-4D97-4D1C-AB47-1EC234D924AA
[2]Doc ID 2075401.1: https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=249715360691380&id=2075401.1&_afrWindowMode=0&_adf.ctrl-state=1agoeyy4f0_80
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库