权限之密码加密RSA加密算法

编辑
  • 文档创建者:文档助手1
  • 浏览次数:4600次
  • 编辑次数:15次
  • 最近更新:Carly 于 2019-09-11
  • 1. 问题描述

    在使用数据集进行身份认证时,密码存在数据库中,认证时用户输入的密码与数据库中密码相同则认证通过,若数据库被破解了则对系统造成威胁,怎样保证系统安全呢?

    2. 实现思路

    就是在 URL 中传用户名密码时,先把密码进行翻转,然后再进行加密,如输入的密码为 12, 实际后台进行加密的值为 21, 再与数据库进行验证,这样就可以避免数据库被破解查看到的是 21 的加密码,登陆系统时以 21 是无法登陆成功的。

    3. 实现步骤

    3.1 加载 bcprov-jdk14-146.jar 驱动包

    RSA 加密使用的第三方包,放到工程 WEB-INF/lib 文件夹下即可,如果没有驱动可点击 bcprov-jdk14-146.jar驱动包 下载。

    注:JBoss 服务器下,使用的第三方加密包,提示报错:Can not parse the BC Provider。需要将此包 bcprov-jdk14-146.jar 从报表工程下移入到 JBoss 默认 JAR  包路径下即可。

    3.2 调用 JS 文件

    RSA 文件夹为前端 JS 加密时需要调用 JS 文件,因此需要将 Barrett.js BigInt.js、RSA.js 放到工程目录下如:WebReport/js,新建 js 文件夹放入 js 文件,如果没有此 js 文件可点击rsa/js下载。

    3.3 定义 RSA 加密类

    定义 RSAUtil.java 类文件,先运行类中generateKeyPair()方法,会在服务器 D 盘中生成一个随机的 RSAKey.txt 文件,保存公钥和密钥,每访问一次这个方法会刷新一次 txt 文件。

    详细代码见:

    https://git.fanruan.com/demo/example/src/release/10.0/src/main/java/com/fr/privilege/RSAUtil.java

    3.4 定义密码验证类

    定义 TestPasswordValidatorRSA.java 密码验证类

    定义一个类,命名为 TestPasswordValidatorRSA.java,扩展于 AbstractPasswordValidator,重写其中密码验证方法 encodePassword,先把输入的密码进行翻转,然后再进行加密,返回密码进行验证,具体代码见:

    https://git.fanruan.com/demo/example/src/release/10.0/src/main/java/com/fr/privilege/TestPasswordValidatorRSA.java

    3.5 编译类文件

    首先编译 RSAUtil.java 类文件在服务器的 D 盘生成 RSAKey.txt 文件,再编译 TestPasswordValidatorRSA.java 类,把编译后的 class 文件放到项目工程 WEB-INF/classes/com/fr/privilege 文件夹中。

    3.6 登陆 Login.jsp 页面设置

    客户端请求到登录页面,随机生成一字符串,此随机字符串作为密钥加密密码,如下代码:


    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <%@page import="com.fr.privilege.providers.dao.RSAUtil"%>
    <%!public String Testmo() {
        String module = "";
        try {
          java.security.interfaces.RSAPublicKey rsap = (java.security.interfaces.RSAPublicKey) RSAUtil
              .getKeyPair().getPublic();
          module = rsap.getModulus().toString(16);
        } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        return module;
      }%>
    <%!public String Testem() {
        String empoent = "";
        try {
          java.security.interfaces.RSAPublicKey rsap = (java.security.interfaces.RSAPublicKey) RSAUtil
              .getKeyPair().getPublic();
          empoent = rsap.getPublicExponent().toString(16);
        } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        return empoent;
      }%>
    <html>
      <head>
        <script type="text/javascript"
          src="ReportServer?op=emb&resource=finereport.js"></script>
        <script type="text/javascript" src="js/RSA.js"></script>
        <script type="text/javascript" src="js/BigInt.js"></script>
        <script type="text/javascript" src="js/Barrett.js"></script>
        <script type="text/javascript">    
      function bodyRSA()  
      {  
        setMaxDigits(130);  
        var a = "<%=Testmo()%>";
      var b = "<%=Testem()%>";
      key = new RSAKeyPair(b,"",a);
      } 
    function doSubmit() {   
      bodyRSA(); 
        var username = FR.cjkEncode(document.getElementById("username").value); //获取输入的用户名    
        var password = FR.cjkEncode(document.getElementById("password").value);  //获取输入的参数    
        $.ajax({    
            url : "ReportServer?op=auth_login&fr_username=" + username + "&fr_password=" + password,   //将用户名和密码发送到报表认证地址op=auth_login   
            data : {__redirect__ : 'false'},        
            complete : function(res) {    
                var jo = FR.jsonDecode(res.responseText);    
                if(jo.url) {    
                   window.location=jo.url+ "&_=" + new Date().getTime();   //认证成功跳转页面,因为ajax不支持重定向所有需要跳转的设置  
                }    
                else{    
                   alert("用户名密码错误!")  //认证失败    
                }    
            }    
        })    
    }    
    </script>
    </head>
      <body>
        <p>
          请登录
        </p>
        <form name="login" method="POST">
          <p>
            用户名:
            <input id="username" type="text" />
          </p>
          <p>
            密 码:
            <input id="password" type="password" />
          </p>
          <input type="button" value="登录" onclick="doSubmit()"  />
        </form>
      </body>
    </html>

    3.7 管理平台设置

    访问报表触发加密文件需要在管理平台>权限配置中设置,勾选自定义密码加密,在文本框中输入 com.fr.privilege.TestPasswordValidatorRSA 即可调用,详细设置可参考文档 简单权限之密码加密


    如上所有设置完之后,RSA 加密算法基本上就设置完成。

    附件列表


    主题: 部署集成
    标签: 暂无标签
    如果您认为本文档还有待完善,请编辑

    文档内容仅供参考,如果你需要获取更多帮助,付费/准付费客户请咨询帆软技术支持
    关于技术问题,您还可以前往帆软社区,点击顶部搜索框旁边的提问按钮
    若您还有其他非技术类问题,可以联系帆软传说哥(qq:1745114201

    此页面有帮助吗?只是浏览 [ 去社区提问 ]