toad連線資料庫時報錯ORA-28040和ORA-01017
軟體及庫情況:toad for 12.1;oracle client 11.2.0.1,oracle server 12.2.0.1;
ORA-28040:
原因:sqlnet.ora中設定的SQLNET.ALLOWED_LOGON_VERSION_SERVER引數導致的客戶端和服務端密碼版本不一致/相容,密碼認證未通過。
解決方法:修改伺服器端sqlnet.ora,新增或修改以下內容:
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
ORA-01017:
原因:現有密碼版本仍未改變,需重新更改一次密碼。PS:更改密碼不影響當前sql developer或SQL*PLUS已有連線。
解決方法:伺服器端重新修改對應賬戶密碼後,重新測試連線。
--檢視賬戶密碼版本
select username,password_versions from dba_users order by password_versions;
最後,引用一位大佬的部落格內容,解釋下兩個引數的影響:
SQLNET.ALLOWED_LOGON_VERSION_CLIENT引數是12C新引進的引數。它表示Cp在向Sp傳送認證(authentication)申請時,所使用的最低版本的認證協議。注意此處的認證協議版本並不等同於Oracle Database的版本。那不同的認證協議版本主要區別在哪兒呢?除了協議語義上的區別,在我看來,最重要的區別在於不同認證協議的版本對應著不同的database version,而不同的database version則可能使用不同的hash演算法對密碼進行加密。不同的hash演算法就是不同的password_version,這個可以從dba_users字典表的password_versions欄位中得到說明。
Oracle在儲存每個account的密碼時,並非是明文儲存,而是會將明文進行雜湊加密儲存,雜湊加密演算法即為該密碼的version,即password_version。從上圖Figure 7中可知,password_version實際上表示是同版本(並非完全一致,見最後的附表)的database 所提供的hash演算法,例如password_version 10g就表示database 10g所提供的hash演算法。如果Oracle所有的新版本都只使用新版本所特有的hash演算法,那麼一些較早的客戶端因為還沒有這些hash演算法,就沒法通過hash演算法得到hash值,也就沒法讓伺服器去驗證這些hash值。為了解決相容性的問題,Oracle會同時用多種hash演算法(即password_version)對密碼進行運算,並將多個運算結果均保留下來。在低版本客戶端訪問高版本的伺服器時,低版本的客戶端可以通報自己使用的認證協議以及使用該協議對應的hash演算法所得到的密碼hash值,伺服器根據認證協議去檢視是否儲存了該協議對應的hash演算法的hash值,如果存在,就比對兩個hash值是否一致;如果不存在或兩個hash值不一致,就報錯。
SQLNET.ALLOWED_LOGON_VERSION_SERVER引數的作用,它介紹了為這個引數設定不同的值所帶來的影響,主要是對PASSWORD_VERSIONS的影響。最後附帶了一張表,詳細了列出了SQLNET.ALLOWED_LOGON_VERSION_SERVER設定不同值,所對應的password_versions。也說明了如果要與設定成當前值的12C資料庫進行密碼認證,所支援的client version。從上圖可以看出,即使SQLNET.ALLOWED_LOGON_VERSION_SERVER設定為8,但生成的最低版本的password version也是10G。因此也說明,8I,9I的客戶端因為沒法理解10G的雜湊函式,也就沒法完成登陸認證。關於客戶端到伺服器端相互之間的相容性如下表:
參考連結1:https://blog.csdn.net/www_xue_xi/article/details/73175995
參考連結2:https://www.cnblogs.com/6yuhang/p/7600929.html