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