1. 問題描述
使用者在登入 FineDataLink 時需要進行 使用者身分驗證 ,系統會對輸入帳號和密碼進行驗證,以確定系統安全。
登入驗證資訊(帳號和登入密碼)儲存在資料庫(FineDataLink 內建資料庫 FineDB 或者其他外接資料庫)中,驗證時使用者輸入密碼與資料庫中密碼相同則驗證透過。
若資料庫被破解,則登入驗證資訊曝光,對系統安全造成威脅。怎樣避免此類情況,保證系統安全呢?
2. 解決方案
使用者可以對資料庫中的登入資訊進行加密。保證即使資料庫被破解,也無法得到使用者的真正登入資訊。
同時,FineDataLink 在 同步使用者 中提供「自訂密碼加密」方式,可以對使用者在登入頁輸入登入資訊進行加密。當加密後的登入資訊與 FineDB 庫中的登入資訊一致時,驗證透過。如下圖所示:
加密簡介:自訂密碼加密,即自訂一個密碼加密類。
加密方式在類中描述,並儲存在%BI_Home%\webapps\webroot\WEB-INF\classes資料夾中。
FineDataLink 會在使用者自訂加密算法的基礎上再進行 SHA256 二次加密,以保證密碼安全。
適用場景:同步的伺服器資料集中的密碼為自訂加密後的密文時,必須使用自訂加密。
加密API:透過API編寫自訂密碼加密類,對使用者輸入「密碼」或「帳號和密碼」經過自訂加密規則進行加密。支援的API如下:
1)只需要對密碼進行加密得到密文:String encode(String originText);//入參是明文密碼,對密碼進行加密得到密文
2)對帳號和密碼進行加密得到密文:String encode(String originUserName, String originPassword);//入參是帳號和明文密碼,傳回結果是密文字元
注1:其中 String encode(String originUserName, String originPassword);加密方式為 2019-01-18 新增的API,包含API1的功能,推薦使用此API。
注2:自訂加密算法,必須繼承 AbstractPasswordValidator 類。
3. 實現思路
3.1 加密驗證邏輯
如果使用者在登入頁面輸入明文密碼後,能夠成功登入 FineDataLink 。那麼在這個程式中會進行三次加密和一次登入驗證。
同步使用者後發生:
1)第一次加密:同步使用者後,系統會對伺服器資料集中的密文進行一次 SHA256 加密,得到的密文寫入 FineDB 庫。
使用者登入時發生:
2)第二次加密:自訂密碼加密,加密物件為使用者輸入明文密碼。
3)第三次加密:系統統一進行的 SHA256 加密,加密物件為第二次加密後的密文。
4)登入驗證:對比第三次加密後得到的密文與 FineDB 庫中的密文,一致則驗證透過。
如下圖所示:
3.2 實現步驟
1)自訂一個密碼加密類,用於加密使用者在登入頁面輸入明文密碼 A。
準備編譯環境
編寫 Java 檔案
編譯 class 檔案
2)建立伺服器資料集,儲存使用者的登入資訊,包括帳號、登入密碼等,其中登入密碼為自訂加密後的密文 B。
注:同步使用者後,系統會對伺服器資料集中該密文進行一次 SHA256 加密,得到的密文寫入 FineDB 庫。
3)同步使用者資訊至 FineDataLink ,用於登入驗證。
使用者來源為步驟 2 中準備的伺服器資料集。
密碼選擇伺服器資料集中的密碼,為自訂加密後的密文。
設定加密方式為自訂加密,使用步驟 1 中準備的密碼加密類。
4. 自訂密碼加密範例
本文範例:編寫 BASE64 密碼加密類,對使用者輸入「密碼」透過自訂加密規則進行加密,然後進行登入驗證,成功登入 FineDataLink 。
注:本文僅對 Base64 加密方式進行簡單範例,對於其他常見的加密方式,本文在第五節提供自訂類檔案,使用者可以根據自己的需求下載使用。
4.1 準備編譯環境
具體操作步驟請參考:編譯Java程式
4.2 編寫Java檔案
在編譯器中定義一個類,命名為 Base64PasswordValidator.java,擴展於 AbstractPasswordValidator。Java 程式碼如下:
package com.fr.decision.privilege.encrpt;;
import com.fr.base.Base64;
import com.fr.base.ServerConfig;
import com.fr.decision.privilege.encrpt.AbstractPasswordValidator;
import com.fr.log.FineLoggerFactory;
import java.io.UnsupportedEncodingException;
public class Base64PasswordValidator extends AbstractPasswordValidator {
public Base64PasswordValidator() {
}
public String encode(String originText) {
try {
return Base64.encode(originText.getBytes(ServerConfig.getInstance().getServerCharset()));
} catch (UnsupportedEncodingException var3) {
FineLoggerFactory.getLogger().debug(var3.getMessage());
return "";
}
}
}
4.3 編譯class檔案
點選下載並解壓獲得 class 檔案:Base64PasswordValidator.zip
1)生成 class 檔案
編譯 Base64PasswordValidator.java,生成 Base64PasswordValidator.class 檔案。
2)匯入 class 檔案
將編譯後的 Base64PasswordValidator.class 檔案儲存到%FineDataLink_HOME%/webapps/webroot/WEB-INF/classes/com/fr/decision/privilege/encrpt資料夾下。
注:若在 %FineDataLink_HOME%\webapps\webroot\WEB-INF\classes\com\fr 下不存在 decision/privilege/encrpt 資料夾,使用者自行建立即可。
4.4 建立伺服器資料集
使用者需要對資料庫中的登入資訊進行 BASE64 加密。然後由系統再次進行 SHA256 加密,最終寫入 FineDB 庫,用於登入校驗。保證即使資料庫被破解,也無法得到使用者的真正登入資訊。
4.4.1 資料準備
準備一張使用者資訊表,其中 password 資料欄中的密碼為 BASE64 加密後的密文。表結構如下圖所示:
範例:若使用者 a 在登入頁面實際輸入明文密碼為:123456,則 password 列中存放的密碼為 BASE64 加密後的密文:MTIzNDU2
點選下載使用者資訊表:
4.4.2 新增伺服器資料集
請自行使用第三方資料庫管理工具,將上表匯入資料庫,並建立系統與該資料庫的 資料連結 。下文將以 FDLDemo 資料庫為例。
1)管理者登入 FineDataLink ,點選「管理系統>資料連結>伺服器資料集」,建立「SQL資料集」。如下圖所示:
2)設定資料集名稱為「同步使用者」,資料連結選擇「FDLDemo」,SQL 語句為:
select * from 同步使用者
4.5 設定加密方式
注:若使用者選擇其他自訂密碼加密方式,可在本節 4.5.2 中更改自訂加密類。本文在第五節提供了常用的自訂加密類檔案,使用者可按需選用。
在同步使用者中可以選擇自訂密碼加密方式來提升系統的安全性。
4.5.1 同步使用者
1)管理者登入 FineDataLink ,點選「管理系統>使用者管理>所有使用者」,點選「同步使用者」。
跳出提示框「是否保留現有非同步資料,包括匯入/新增的使用者、部門職務、角色」,如下圖所示:
注1:本章是針對「之前從未進行過同步使用者」、「同步使用者未開啟狀態下執行首次同步操作」的資料更新規則。
若之前同步過使用者,在同步使用者開啟狀態下執行非首次同步操作將不會出現此節提示彈窗,也不會按照此節中更新規則進行同步。
注2:同步的使用者與「手動新增/匯入的使用者」可並存。
不同選擇對應的更新邏輯如下:
選擇 | 定義 |
---|---|
保留 | 如果現有使用者不在同步的伺服器資料集中,該使用者資訊和權限將被保留,不修改 如果現有使用者在伺服器資料集中(帳號相同):
|
清空 | 平台現有「手動新增/匯入的使用者」的帳號、姓名、密碼、手機、信箱、部門、職務、角色、權限均被刪除,重新同步使用者 |
注:根據選擇的更新邏輯,首次同步後有部分使用者資訊被更新。
之後能被自動更新的只有已變為同步類型的使用者。
之後的同步,資料集不能再改寫更新內建資料,否則將衝突報錯。
4.5.2 加密配置
1)使用者來源選擇為:4.4.2 中準備的伺服器資料集「同步使用者」
2)密碼選擇為:password
3)加密方式選擇為:自訂密碼加密,使用 4.3 節中準備的 Base64PasswordValidator.class 自訂加密類
如下圖所示:
注:如需使用自訂加密方法,在 同步使用者 的時候,不能勾選「使用者可編輯」選項,否則會導致使用者無法登入。
點選「確定」,同步使用者成功。如下圖所示:
4.6 效果預覽
使用者 1 登入 FineDataLink :
伺服器資料集中使用者 1 的密文:MTIzNDU2 ,其解密後的明文:123456
在登入頁面輸入明文密碼:123456,點選「登入」,成功登入 FineDataLink 。如下圖所示:
5. 常用的自訂密碼加密方式
本文提供了常用的自訂密碼加密方式檔案,使用者可根據需求使用。點選下載檔案後放到指定資料夾下,並更改 4.5.2 節中的自訂類,其餘步驟參照第四節範例即可。
5.1 BASE64加密帳號和密碼
FineDataLink 支援使用 BASE64 加密方式對使用者輸入帳號和密碼一起進行加密。
現提供編譯後的 BASE64 加密類,點選下載檔案:Base64UserPasswordValidator.class.zip
1)點選下載並解壓獲得 class 檔案,將檔案儲存到%FineDataLink_HOME%/webapps/webroot/WEB-INF/classes/com/fr/decision/privilege資料夾下。
2)配置伺服器資料集中 password 列為“帳號+密碼”的 BASE64 加密密文。
範例:使用者 a 的密碼是 123456,則伺服器資料集中,password 列應該是 a123456 的 BASE64 加密密文YTEyMzQ1Ng==
5.2 SHA256加密密碼
FineDataLink 支援使用 SHA256 加密方式對使用者輸入密碼進行加密。
現提供編譯後的 SHA256 加密類,點選下載檔案:SHA256PasswordValidator.zip
點選下載並解壓獲得 class 檔案,將檔案儲存到%FineDataLink_HOME%/webapps/webroot/WEB-INF/classes/com/fr/decision/privilege/encrpt資料夾下。
5.3 SHA256加密帳號和密碼
FineDataLink 支援使用 SHA256 加密方式對使用者輸入帳號和密碼一起進行加密。
現提供編譯後的 SHA256 加密類,點選下載檔案:CustomSHA256PasswordValidator.zip
1)點選下載並解壓獲得 class 檔案,將檔案儲存到%FineDataLink_HOME%/webapps/webroot/WEB-INF/classes/com/fr/decision/privilege/encrpt資料夾下。
2)配置伺服器資料集中 password 列為“帳號+密碼”的 SHA256 加密密文。
範例:使用者 a 的密碼是 123456,則伺服器資料集中,password 列應該是 a123456 的 SHA256 加密密文20f645c703944a0027acf6fad92ec465247842450605c5406b50676ff0dcd5ea
5.4 MD5(32位小寫)加密密碼
FineDataLink 支援使用 MD5(32位小寫)加密方式對使用者輸入密碼進行加密。
現提供編譯後的 MD5(32位小寫)加密類,點選下載檔案:MD5CasePasswordValidator.zip
點選下載並解壓獲得 class 檔案,將檔案儲存到%FineDataLink_HOME%/webapps/webroot/WEB-INF/classes/com/fr/decision/privilege資料夾下。
5.5 MD5(32位小寫)加密帳號和密碼
FineDataLink 支援使用 MD5(32位小寫)加密方式對使用者輸入帳號和密碼一起進行加密。
現提供編譯後的 MD5(32位小寫)加密類,點選下載檔案:MD5CaseUserPasswordValidator.class.zip
1)點選下載並解壓獲得 class 檔案,將檔案儲存到%FineDataLink_HOME%/webapps/webroot/WEB-INF/classes/com/fr/decision/privilege資料夾下。
2)配置伺服器資料集中 password 列為“帳號+密碼”的 MD5(32位小寫)加密密文。
範例:使用者 a 的密碼是 123456,則伺服器資料集中,password 列應該是 a123456 的 MD5(32位小寫)加密密文dc483e80a7a0bd9ef71d8cf973673924
5.6 MD5(32位大寫)加密密碼
FineDataLink 支援使用 MD5(32位大寫)加密方式對使用者輸入密碼進行加密。
現提供編譯後的 MD5(32位大寫) 加密類,點選下載檔案:MD5UpperCasePasswordValidator.zip
點選下載並解壓後,將檔案儲存到%FineDataLink_HOME%/webapps/webroot/WEB-INF/classes/com/fr/decision/privilege資料夾下。
5.7 MD5(32位大寫)加密帳號和密碼
FineDataLink 支援使用 MD5(32位大寫)加密方式對使用者輸入帳號和密碼一起進行加密。
現提供編譯後的 MD5(32位大寫)加密類,點選下載檔案:MD5UpperCaseUserPasswordValidator.zip
1)點選下載並解壓後,將檔案儲存到%FineDataLink_HOME%/webapps/webroot/WEB-INF/classes/com/fr/decision/privilege資料夾下。
2)配置伺服器資料集中 password 列為“帳號+密碼”的 MD5(32位大寫)加密密文。
範例:使用者 a 的密碼是 123456,則伺服器資料集中,password 列應該是 a123456 的 MD5(32位大寫)加密密文DC483E80A7A0BD9EF71D8CF973673924