密码加密、MD5加密,解密,如何实现自定义密码加密,不设置密码加密,内置MD5加密,密码加密原理
1. 问题描述
在使用数据集进行身份认证时,密码存在数据库中,认证时用户输入的密码与数据库中密码相同则认证通过,若数据库被破解了则对系统造成威胁,怎样保证系统安全呢?
2. 解决方案
在定义数据集身份认证时,使用密码加密功能。数据库中存的是密文,输入的密码需要进行加密才能和数据库中的密文进行匹配,加大破解难度,提高系统安全性。
3. 实现原理
3.1 设置方法
在管理平台>权限配置>身份验证方式配置>数据集身份验证中设置如下图:
- 密码加密功能分为不设置密码加密、自定义密码加密和内置MD5加密。
不设置密码加密和内置MD5加密已经封装了,直接勾选即可,其中MD5加密只支持32位;
定义密码加密需要将自定义的密码验证类(包含了加密方法)放在报表服务如/WebReport/WEB-INF/classes下,勾选自定义密码加密,并指向自定义的密码验证类。具体可参考下方的自定义密码加密示例。 3.2 原理
用户输入密码后提交,报表服务器会调用密码验证方法validatePassword(localPassword, clientPassword)来判断数据库中密码和用户输入密码的匹配情况,相同返回true,否则返回false。
若设置了加密规则,validatePassword方法中会先对用户输入密码进行加密转换,再与数据库密码匹配。
不设置密码加密:用户输入的密码与数据库中的密码一致,密码验证方法返回:return localPassword.equals(clientPassword);
内置MD5加密:用户输入的密码经过32位MD5加密,再和数据库中的密码进行匹配,密码验证方法返回:return localPassword.equals(MD5(clientPassword));
自定义密码加密:用户输入的密码经过自定义加密规则进行加密,再和数据库中的密码进行匹配,密码验证方法返回:return localPassword.equals(div(clientPassword));
注:验证方法validatePassword中localPassword为数据库中的密码,clientPassword为用户输入的密码。
4. 自定义密码加密示例
下面我们制作一个简单的自定义密码加密,实现用户输入密码需要再加上"FR"才能与数据集库的密码匹配。
4.1 自定义密码验证类
定义一个类,命名为TestPasswordValidator.java,扩展于AbstractPasswordValidator,重写其中密码验证方法validatePassword,具体代码如下:
将编译的TestPasswordValidator.class放在/WebReport/WEB-INF/classes/com/fr/privilege/providers/dao目录下。
4.2 管理平台设置
勾选自定义密码加密,在文本框中输入com.fr.privilege.providers.dao.TestPasswordValidator,如下图所示:
设置后,数据库密码如123FR,用户输入123时可以登录成功。
注:这边是举了一个最简单的例子,您可以根据自己的需求自己定义加密的方式。
返回顶部