security.js RSA加密與java客戶端解密

whm156377發表於2020-03-31

  在通常的http協議的網站中直接提交資料可以透過資訊抓取從而暴露提交者所提交的資訊,(伍子胥:l47可181O微51l3可微)   特別是註冊時的密碼和登入時的密碼容易被洩露。那麼怎麼防止這種現象呢?很多人會想到加密技術,對沒錯,本文所講的就是使用rsa非對稱加密技術進行資料提交,由客戶獲取後臺所產生的公鑰對提交欄位進行加密,使用者提交後再由後臺所產生的私鑰進行解密。這裡以使用者登入時對使用者密碼進行加密為列,下面直接上程式碼:


  前端js程式碼:


<script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>

    <script type="text/javascript" src="js/security.js"></script>

    <script type="text/javascript">

    $(function(){

        $('#subt').click(function(){

                var name = jQuery('#loginName').val();

                var password =jQuery('#loginPwd').val();

                if(name==null||name==""){

                    alert("使用者名稱不得為空!");

                    return;

                }

                if(password==null||password==""){

                    alert("密碼不得為空!");

                    return;

                }

                jQuery.ajax({

                type:"post",

                url:"loginset",

                success:function(rd){

                    if(rd!=null){

                        //加密模

                        var Modulus = rd.split(';')[0];

                        //公鑰指數

                        var public_exponent = rd.split(';')[1];

                        //透過模和公鑰引數獲取公鑰

                        var key = new RSAUtils.getKeyPair(private_exponent, "", Modulus);

                        //顛倒密碼的順序,要不然後解密後會發現密碼順序是反的

                        var reversedPwd = password.split("").reverse().join("");

                        //對密碼進行加密傳輸 

                        var encrypedPwd = RSAUtils.encryptedString(key,reversedPwd);

                        jQuery('#subPwd').val(encrypedPwd);

                        jQuery('#loginPwd').val("");

                        jQuery('#login').submit();

                    }

                }

            })

        })


    })


    </script>


  前端html程式碼:


<div style="text-align: center;">

  <form id="login" action="login" method="post">

   <input type="hidden" id="subPwd" name="subPwd" />

        <table align="center">

            <tr>

                <td>登入</td>

            </tr>

            <tr>

                <td>使用者名稱:<input type="text" id="loginName" name="loginName" /></td>

            </tr>

            <tr>

                <td>密&nbsp;&nbsp;&nbsp;碼:<input type="password" id="loginPwd" name="loginPwd" /></td>

            </tr>

            <tr>

                <td><input id="subt" type="button" value="登入" /></td>

            </tr>

        </table>

    </form>

 </div>


後臺java產生RSA加密引數程式碼:


RSAUtils rsa = new RSAUtils();

//生成公鑰和金鑰

Map<String,Object> keyMap = rsa.createKey();

RSAPublicKey publicKey = (RSAPublicKey) keyMap.get("publicKey");

RSAPrivateKey privateKey = (RSAPrivateKey) keyMap.get("privateKey");

//js透過模和公鑰指數獲取公鑰對字串進行加密,注意必須轉為16進位制

//模

String Modulus = publicKey.getModulus().toString(16);

//公鑰指數

String Exponent = publicKey.getPublicExponent().toString(16);

//私鑰指數    

String private_exponent = privateKey.getPrivateExponent().toString();

HttpSession session = request.getSession();

      //java中的模和私鑰指數不需要轉16進位制,但是js中的需要轉換為16進位制

session.setAttribute("Modulus",publicKey.getModulus().toString());

session.setAttribute("private_exponent",private_exponent);

String strSet = Modulus+";"+Exponent;


response.setContentType("text/html;charset=UTF-8");

response.setCharacterEncoding("UTF-8");

PrintWriter out = response.getWriter();

out.write(strSet);

out.flush();


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69926583/viewspace-2683527/,如需轉載,請註明出處,否則將追究法律責任。

相關文章