历史版本50 :同步用户密码加密设置 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 问题描述编辑

在平台内置进行 用户身份验证 的时候,密码存在数据库(FineReport 内置数据库 FineDB 或者其他外接数据库)中,认证时用户输入的密码与数据库中密码相同则认证通过。

若数据库被破解了则对系统造成威胁,怎样保证系统安全呢?

2. 解决方案编辑

在进行 同步用户 的时候,使用密码加密功能。数据库中存的是密文,输入的密码需要进行加密才能和数据库中的密文进行匹配,加大破解难度,提高系统安全性。

3. 实现原理编辑

3.1 设置方法

登录平台,点击「管理系统>用户管理>同步用户」的时候,设置加密方式,如下图所示:

有两种加密方式,「内置 SHA 加密」和「自定义密码加密」。

图片.png

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,详细的代码参见:

https://code.fanruan.com/demo/example/src/release/10.0/src/main/java/com/fr/decision/privilege/encrpt/Base64PasswordValidator.java

点击下载并解压 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 加密类即可,如下图所示:

注:本文仅进行简单示例,您可以根据自己的需求自己定义加密的方式。

image.png

4.2 SHA256 加密方式

4.2.1 自定义密码加密类

定义一个类,命名为 CustomSHA256PasswordValidator.java,扩展于 AbstractPasswordValidator,详细的代码参见:

https://code.fanruan.com/demo/example/src/release/10.0/src/main/java/com/fr/decision/privilege/encrpt/CustomSHA256PasswordValidator.java

点击下载并解压 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 加密类即可。

image.png

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 加密类即可,如下图所示:

image.png

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