1. 問題描述
使用者在登入 FineDataLink 系統時需要進行 用户身份验证 ,系統會對輸入帳號和密碼進行驗證,以確定系統安全。
登入驗證資訊(帳號和登入密碼)儲存在資料庫(FineDataLink 內建資料庫 FineDB 或者其他外接資料庫)中,驗證時使用者輸入密碼與資料庫中密碼相同則驗證透過。
若資料庫被破解,則登入驗證資訊曝光,對系統安全造成威脅。怎樣避免此類情況,保證系統安全呢?
2. 解決方案
使用者可以對 FineDB 中的登入資訊進行加密。保證即使資料庫被破解,也無法得到使用者的真正登入資訊。
同時,FineDataLink 在 导入用户中提供「自訂密碼加密」方式,可以對使用者在登入頁輸入登入資訊進行加密。當加密後的登入資訊與 FineDB 庫中的登入資訊一致時,驗證透過。如下圖所示:
加密簡介:自訂密碼加密,即自訂一個密碼加密類。
加密方式在類中描述,並儲存在%FineDataLink_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)第一次加密:匯入使用者後,系統會對伺服器資料集中的明文進行自訂加密。
2)第二次加密:系統統一進行的 SHA256 加密,加密物件為第一次加密伺服器資料集後得到的密文,得到的密文寫入 FineDB 庫。
使用者登入時發生:
3)第三次加密:使用者選取的自訂密碼加密方式,加密物件為使用者輸入明文密碼。
4)第四次加密:系統統一進行的 SHA256 加密,加密物件為第三次加密後的密文。
5)登入驗證:對比第四次加密後得到的密文與 FineDB 庫中的密文,一致則驗證透過。
如下圖所示:
3.2 實現步驟
1)自訂一個密碼加密類,用於加密使用者在登入頁面輸入明文密碼 A。
準備編譯環境
編寫 Java 檔案
編譯 class 檔案
2)建立伺服器資料集,儲存使用者的登入資訊,包括帳號、登入密碼等。
3)匯入使用者資訊至 FineDataLink ,用於登入驗證。
使用者來源為步驟 2 中準備的伺服器資料集。
密碼選擇伺服器資料集中的密碼,為自訂加密後的密文。
設定加密方式為自訂加密,使用步驟 1 中準備的密碼加密類。
4. 自訂密碼加密範例
本文範例:編寫 BASE64 密碼加密類,對使用者輸入“密碼”透過自訂加密規則進行加密,然後進行登入驗證,成功登入 FineBI 系統。
注:本文僅對 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 建立伺服器資料集
使用者在資料庫中準備的密碼會經過兩次加密後寫入 FineDB 庫,用於登入校驗。保證即使資料庫被破解,也無法得到使用者的真正登入資訊。
4.4.1 資料準備
準備一張使用者資訊表,其中 password 資料欄中的密碼是明文。表結構如下圖所示:
範例:若使用者 a 在登入頁面實際輸入明文密碼為:123456,則 password 列中存放的密碼為 123456
點選下載使用者資訊表:导入用户.xlsx
4.4.2 新增伺服器資料集
請自行使用第三方資料庫管理工具,將上表匯入資料庫,並建立系統與該資料庫的 建立並管理資料源 。下文將以 FDLDemo 資料庫為例。
1)管理者登入 FineDataLink ,點選「管理系統>資料連結>伺服器資料集」,建立「SQL資料集」。如下圖所示:
2)設定資料集名稱為「匯入使用者」,資料連結選擇「FDLDemo」,SQL 語句為:
select * from 匯入使用者
4.5 設定加密方式
注:若使用者選擇其他自訂密碼加密方式,可在本節 4.5.2 中更改自訂加密類。本文在第五節提供了常用的自訂加密類檔案,使用者可按需選用。
在匯入使用者中可以選擇自訂密碼加密方式來提升系統的安全性。
4.5.1 匯入使用者
1)管理者登入 FineDataLink ,點選「管理系統>使用者管理>所有使用者」,點選「匯入使用者」,配置使用者資訊。如下圖所示:
4.5.2 加密配置
1)使用者來源選擇為:4.4.2 中準備的伺服器資料集「匯入使用者」
2)密碼選擇為:password
3)加密方式選擇為:自訂密碼加密,使用 4.3 節中準備的 Base64PasswordValidator.class 自訂加密類
如下圖所示:
點選「確定」後,由於使用者想要將加密方式由「內建 SHA 加密」變更為「自訂加密方式」,系統會彈窗提示「更改加密方式將清空原有匯入/新增的使用者、部門、職務、角色資料,並重置管理者帳號,確定更改?」。如下圖所示:
點選「確定」,清空原有匯入/新增的使用者、部門、職務、角色資料,並重置管理者帳號後,匯入使用者成功,如下圖所示:
4.6 效果預覽
使用者 a 登入 FineDataLink :
伺服器資料集中使用者 a 的密碼:123456 ,在登入頁面輸入明文密碼:123456。
點選「登入」,成功登入 FineDataLink 。如下圖所示:
5. 常用的自訂密碼加密方式
本文提供了常用的自訂密碼加密方式檔案,使用者可根據需求使用。點選下載檔案後放到指定資料夾下,並更改 4.5.2 節中的自訂類,其餘步驟參照第四節範例即可。
5.1 BASE64加密帳號和密碼
FineDataLink 支援使用 BASE64 加密方式對使用者輸入帳號和密碼一起進行加密。
現提供編譯後的 BASE64 加密類,點選下載檔案:Base64UserPasswordValidator.class.zip
1)點選下載並解壓獲得 class 檔案,將檔案儲存到%BI_HOME%/webapps/webroot/WEB-INF/classes/com/fr/decision/privilege資料夾下。
2)配置伺服器資料集中 password 列為“密碼”的明文,系統會對“帳號+密碼”進行加密,最終入庫 FineDB。
範例:使用者 a 的密碼是 123456,則伺服器資料集中,password 列應該是 123456,系統對 a123456 加密。
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 列為“密碼”的明文,系統會對“帳號+密碼”進行加密,最終入庫 FineDB。
範例:使用者 a 的密碼是 123456,則伺服器資料集中,password 列應該是 123456,系統對 a123456 加密。
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 列為“密碼”的明文,系統會對“帳號+密碼”進行加密,最終入庫 FineDB。
範例:使用者 a 的密碼是 123456,則伺服器資料集中,password 列應該是 123456,系統對 a123456 加密。
5.6 MD5(32位大寫)加密密碼
FineDataLink 支援使用 MD5(32位大寫)加密方式對使用者輸入密碼進行加密。
現提供編譯後的 MD5(32位大寫)加密類,點選下載檔案:MD5UpperCasePasswordValidator.zip
點選下載並解壓獲得 class 檔案,將檔案儲存到%FineDataLink_HOME%/webapps/webroot/WEB-INF/classes/com/fr/decision/privilege資料夾下。
5.7 MD5(32位大寫)加密帳號和密碼
FineDataLink 支援使用 MD5(32位大寫)加密方式對使用者輸入帳號和密碼一起進行加密。
現提供編譯後的 MD5(32位大寫)加密類,點選下載檔案:MD5UpperCaseUserPasswordValidator.zip
1)點選下載並解壓獲得 class 檔案,將檔案儲存到%FineDataLink_HOME%/webapps/webroot/WEB-INF/classes/com/fr/decision/privilege資料夾下。
2)配置伺服器資料集中 password 列為“密碼”的明文,系統會對“帳號+密碼”進行加密,最終入庫 FineDB。
範例:使用者 a 的密碼是 123456,則伺服器資料集中,password 列應該是 123456,系統對 a123456 加密。