RSA 加密算法

  • 文档创建者:文档助手1
  • 编辑次数:17次
  • 最近更新:Carly 于 2020-10-16
  • 1. 概述

    1.1 版本

    报表服务器版本
    10.0

    1.2 问题描述

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

    1.3 实现思路

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

    2. 操作步骤

    2.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  包路径下即可。

    2.2 调用 JS 文件

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

    2.3 定义 RSA 加密类

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

    详细代码请参见:详细代码

    2.4 定义密码验证类

    定义TestPasswordValidatorRSA.java密码验证类

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

    2.5 编译类文件

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

    2.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>

    2.7 管理平台设置

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

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

    附件列表


    主题: 数据决策系统
    • 有帮助
    • 没帮助
    • 只是浏览
    • 评价文档,奖励 1 ~ 100 随机 F 豆!