1. 問題描述
在平台内置進行 用戶身份驗證 的時候,密碼存在數據庫(FineReport 内置數據庫 FineDB 或者其他外接數據庫)中,認證時用戶輸入的密碼與數據庫中密碼相同則認證通過。
若數據庫被破解了則對系統造成威脅,怎樣保證系統安全呢?
2. 解決方案
在進行 同步用戶 的時候,使用密碼加密功能。數據庫中存的是密文,輸入的密碼需要進行加密才能和數據庫中的密文進行匹配,加大破解難度,提高系統安全性。
3. 實現原理
3.1 設置方法
登錄平台,點擊「管理系統>用戶管理>同步用戶」的時候,設置加密方式,如下圖所示:
有兩種加密方式,「内置 SHA 加密」和「自定義密碼加密」。
3.2 内置 SHA 加密
适用場景:同步的服務器數據集中的密碼爲明文時,選擇内置 SHA 加密。
加密簡介:數據決策系統采用 SHA256 加密方式,以保證密碼安全。加密方式已經封裝了,用戶通過接口自定義修改密碼後,會自動進行 SHA256 加密。
登錄密碼:登錄密碼即爲同步的服務器數據集中的密碼,非 fine_user用戶表 中加密的密碼。
3.3 自定義密碼加密
适用場景:同步的服務器數據集中的密碼爲自定義加密後的密文,則必須使用自定義加密。
加密簡介:自定義密碼加密,即自定義一個密碼加密類。
加密方式在類中描述,并保存在%BI_Home%\webapps\webroot\WEB-INF\classes文件夾中。
數據決策系統會在用戶自定義加密算法的基礎上再進行 SHA256 二次加密,以保證密碼安全。
登錄密碼:登錄密碼爲同步的服務器數據集的密文解密之後的明文。
加密接口:用戶輸入的“密碼”或“用戶名和密碼”經過自定義加密規則進行加密,再和數據庫中的信息進行匹配,支持 2 個接口實現方法,如下:
1)只需要對密碼進行加密得到密文:String encode(String originText);//入參是明文密碼,對密碼進行加密得到密文
2)對用戶名和密碼進行加密得到密文:String encode(String originUserName, String originPassword);//入參是用戶名和明文密碼,返回結果是密文字符
注1:其中 String encode(String originUserName, String originPassword);加密方式爲 2019-01-18 新增的接口,包含接口1的功能,推薦使用此接口。
注2:自定義加密算法,必須繼承 AbstractPasswordValidator 類,并加上返回判斷明文密碼和密文密碼是否一緻結果方法才可行。
4. 自定義密碼加密示例
下面我們制作三個簡單的自定義密碼加密示例:實現自定義密碼 BASE64 加密、SHA256、MD5 加密。
4.1 BASE64 加密方式
4.1.1 自定義密碼驗證類
定義一個類,命名爲 Base64PasswordValidator.java,擴展於 AbstractPasswordValidator,詳細的代碼參見:
點擊下載并解壓 Base64PasswordValidator.class:Base64PasswordValidator.rar
将編譯的 Base64PasswordValidator.class 放在/webapps/webroot/WEB-INF/classes/com/fr/decision/privilege/encrpt目錄下。
注1:這裏使用 String encode(String originText);//只對密碼進行加密得到密文。
注2:需要重啓工程。
4.1.2 平台設置
在平台的用戶同步數據集>加密方式>自定義加密類中選擇 BASE64 加密類即可,如下圖所示:
注:本文僅進行簡單示例,您可以根據自己的需求自己定義加密的方式。
4.2 SHA256 加密方式
4.2.1 自定義密碼加密類
定義一個類,命名爲 CustomSHA256PasswordValidator.java,擴展於 AbstractPasswordValidator,詳細的代碼參見:
點擊下載并解壓 CustomSHA256PasswordValidator.class:CustomSHA256PasswordValidator.rar
将編譯的 CustomSHA256PasswordValidator.class 放在/webapps/webroot/WEB-INF/classes/com/fr/decision/privilege/encrpt目錄下。
注:這裏使用 String encode(String originUserName, String originPassword);//對用戶名和密碼一起進行加密得到密文。
4.2.2 平台設置
同 BASE64 加密方式,在平台的「同步用戶>加密方式>自定義加密類」中選擇 SHA256 加密類即可。
4.3 MD5 加密方式
9.0 及以前的版本,同步數據集中密碼可以選擇“内置 MD5 加密”,而在 FR10.0 中取消了默認的 MD5 加密。
若用戶的工程是 9.0 升級到 10.0 的,而在升級之前用戶同步采用的是默認内置 MD5 加密或者用戶就想使用 MD5 加密方式,又該如何處理呢?
4.3.1 下載 MD5 加密類
現提供現成的 MD5 加密類 :decision-new-password.zip
點擊下載并解壓之後,将類放於%FR_HOME%\webroot\WEB-INF\classes\com\fr\decision目錄下。
4.3.2 平台設置
在平台的「同步用戶>加密方式>自定義加密類」中選擇 MD5 加密類即可,如下圖所示:
4.3.3 支持用戶名加密
若用戶需要的是【用戶名+密碼】的方式進行自定義加密,請使用文件:decision.zip,使用方法同上。
4.3.4 注意事項
9.0 版本 FineReport 内置的 MD5 加密方式不區分密文大小寫,10.0 版本 FineReport适配的 MD5 加密方式區分大小寫。
9.0 同步選擇内置 MD5 加密,升級後會内置一個小寫 MD5 的 class,如果是大寫密文,升級後就不能登錄,需要手動替換大寫 class,使用方法同上。
class 文件點擊下載:MD5UpperCasePasswordValidator.rar