JAVA 使用 RSA 简单的实现登陆加密

版权声明:本文为博主原创文章,互联网的本质是自由与分享,若您需要引用、转载,只需要注明来源及原文链接即可 https://blog.csdn.net/qq_34207366/article/details/84668998

JAVA 使用 RSA 登陆加密

之前没有做过关于登陆加密的问题,现在公司有新的需求了。

所以了解了一些关于加密的问题,做个笔记记录下

仅供参考,不提供源码,和文件

首先在使用RSA加密之前,简单的了解一下什么是 RSA加密(百度百科)

RSA加密算法是一种非对称加密算法。在公开密钥加密电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

​ 1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个相同的算法,但他的发现被列入机密,一直到1997年才被发表。

​ 对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。

​ 1983年麻省理工学院在美国为RSA算法申请了专利。这个专利2000年9月21日失效。由于该算法在申请专利前就已经被发表了,在世界上大多数其它地区这个专利权不被承认。

具体实现的步骤是

  1. 进入登陆页面之前 在contorller 层生成密钥

    @RequestMapping(value = "/login", method = RequestMethod.GET)
        public String login(HttpServletRequest request, Model model) {
            try {
                //初始化密钥
                Map<String, Key> keyMap = RSACoder.initKey();
                //获取
                String publicKey = RSACoder.getPublicKey(keyMap);
                String privateKey = RSACoder.getPrivateKey(keyMap);
                //存入session
                HttpSession session = request.getSession();
                session.setAttribute("publicKey", publicKey);
                session.setAttribute("privateKey", privateKey);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //转跳登陆页面
            return "/login";
        }
    
  2. 此时会转跳至登陆页面,只需要使用以下方法即可进行加密

    <!doctype html>
    <html lang="en" xmlns:th="http://www.springframework.org/schema/mvc">
    <head>
        <meta charset="UTF-8">
        <title>login</title>
        <script src="js/jsencrypt.min.js"></script>
    </head>
    <body>
        <form method="post" action="/login" onsubmit="return fun()" name = "user">
            用户名: <input type="text" name="uName" class="text">  <br>
            密码: <input type="text" name="pwd" class="text">  <br>
            <input type="submit" class="button">
        </form>
    </body>
    <script src="js/jsencrypt.min.js"></script>
    <script th:inline="javascript">
        function fun(){
            //获取 name为'user'的from元素下面的 name为'pwd'的元素的值
            //就是获取 form 表单中的 密码
            var password = user.pwd.value;  
    		
            //创建 JSEncrypt 对象
            var encrypt = new JSEncrypt();
            
            //获取 session中的 publicKey
            encrypt.setPublicKey('[[${session.publicKey}]]');
            
            //对密码加密,并且放入 input的value值中
            document.getElementsByName("pwd")[0].value = encrypt.encrypt(password);
            return true;
        }
    
    </script>
    </html>
    
  3. 此时提交就会进入登陆方法,我们只需要通过privateKey对其进行解密即可

    /**
    * 登陆
    *
    * @param uName 用户名
    * @param pwd   加密后的密码
    * @param request
    * @return
    */
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String login(String uName, String pwd, HttpServletRequest request) {
       //获取 session中的 privateKey
       String privateKey = (String) request.getSession().getAttribute("privateKey");
       BASE64Decoder decoder = new BASE64Decoder();
       try {
           byte[] encodedData = decoder.decodeBuffer(pwd);
           byte[] decodedData = RSACoder.decryptByPrivateKey(encodedData, privateKey);
           String newPwd = new String(decodedData); //解密后的密码 
       } catch (Exception e) {
            e.printStackTrace();    
       }
       return null;
    }
    

猜你喜欢

转载自blog.csdn.net/qq_34207366/article/details/84668998
今日推荐