登錄頁面之RSA加密


 

我的項目是金融類項目,所以一般的form表單做登錄頁面未免太草率,所以決定使用加密技術RSA,

RSA是目前使用最為廣泛的非對稱性加密算法,其設計思路為:將兩個大素數進行相乘,乘積作為公鑰,而對乘積進行因式分解的素數組合成私鑰,

解密者擁有私鑰,並且將由私鑰計算生成的公鑰發布給加密者。加密都使用公鑰進行加密,並將密文發送到解密者,解密者用私鑰解密將密文解碼為明文。

算法實現過程為:

        1. 隨意選擇兩個大的質數p和q,p不等於q,計算N=pq。
        2. 根據歐拉函數,不大於N且與N互質的整數個數為(p-1)(q-1)。
        3. 選擇一個整數e與(p-1)(q-1)互質,並且e小於(p-1)(q-1)。
        4. 用以下這個公式計算d:d× e ≡ 1 (mod (p-1)(q-1))。
        5. 將p和q的記錄銷毀。
        以上內容中,(N,e)是公鑰,(N,d)是私鑰。
項目使用的ajax發送http登錄請求,采用jsencypt加密,保護用戶登錄賬號安全。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<!doctype html>
<html>
   <head>
     <title>JavaScript RSA Encryption</title>
     <script src= "http://code.jquery.com/jquery-1.8.3.min.js" ></script>
     <script src= "./jsencrypt.min.js" ></script>
     <script type= "text/javascript" >
// 使用jsencrypt類庫加密js方法,
function encryptRequest(reqUrl, data, publicKey){
     var encrypt = new JSEncrypt();
     encrypt.setPublicKey(publicKey);
     // ajax請求發送的數據對象
     var sendData = new Object();
     // 將data數組賦給ajax對象
     for (var key in data){
         sendData[key] = encrypt.encrypt(data[key]);
     }
  
       $.ajax({
             url: reqUrl,
             type: 'post' ,
             data: sendData,
             dataType: 'json' ,
             success: function (data) {                   
                 console.info(data);
             },
             error: function (xhr) {
                 console.error( '出錯了' );
             }
         });
  
}
  
       // Call this code when the page is done loading.
       $(function() {
  
         $( '#testme' ).click(function() {
              
             var data = [];
             data[ 'username' ]= $( '#username' ).val();
             data[ 'passwd' ]= $( '#passwd' ).val();
  
             var pkey = $( '#pubkey' ).val();
             encryptRequest( './test.php' , data, pkey);
         });
       });
     </script>
   </head>
   <body>
     <label for = "pubkey" >Public Key</label><br/>
     <textarea id= "pubkey" rows= "15" cols= "65" >-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCBWNoG5LJ3u44Gs8PWs1MaNUQQ
+mOmh+9zWdzSt3ORbmfCDvU+ssW/6QTTgXvWWx7+Wzq/a4fCCQp72zSqXeVhWkTV
ct9Hyp/iMo5K6qOEK76z9z+tP/u99X6qazeXGVMWKkPiyZT4mKAGd/U8Mph9Z1Z5
kOluA7g7heq8PPlE9wIDAQAB
-----END PUBLIC KEY-----</textarea><br/>
     <label for = "input" >Text to encrypt:</label><br/>
     name:<input id= "username" name= "username" type= "text" ></input><br/>
     password:<input id= "passwd" name= "passwd" type= "password" ></input><br/>
     <input id= "testme" type= "button" value= "submit" /><br/>
   </body>
</html>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
      
// 接收客戶端發送過來的經過加密的登錄信息
$input = $_POST;
// 私鑰是放在服務器端的,用以驗證和解密客戶端經過公鑰加密后的信息
$private_key = '-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCBWNoG5LJ3u44Gs8PWs1MaNUQQ+mOmh+9zWdzSt3ORbmfCDvU+
ssW/6QTTgXvWWx7+Wzq/a4fCCQp72zSqXeVhWkTVct9Hyp/iMo5K6qOEK76z9z+t
P/u99X6qazeXGVMWKkPiyZT4mKAGd/U8Mph9Z1Z5kOluA7g7heq8PPlE9wIDAQAB
AoGABPQwNX9gznEieWM9JuXrUt+jYbsVQfWG2DYi3Pclt/YwhyAniGU0aas1Ahy9
b3JB95/q2hX2Nxo9iozUsYmzFT99dm2HBsHDnpnUgpyDtGo9sXlhLktyey53UKRx
QJkW5dWWUQfssNrCe08N3vtLiDIy04lRQ8F0eJ/iklzk1HECQQC22pOz7V2K5/ 50
w9LA9UBSl7wWhTTY5G1gsBEm5tNmbM/ZqCJ1FXB4uuDgz0o0N0x8T8JkkPrRWH5q
GIHFRswVAkEAtRbV8PoLnyT73hxtCw0F17aaI8W5AGhvsbjdA6nMo6byBR5xKN+ 7
lalfXYEfXPnStHVNSnQVFjN3T06iJV6z2wJBAKj51rLYcLBT8XbQG+vK+FUa+WrK
UGr6tQU7z63mc4dcmLtoP+d5F4XKFNRLWyRj0d+zCU5MGCzrnW7IFOxMn30CQEtv
4N3K/C5mtLmZM9+npChxfBKs2l2OJAFwFjnhcUs3T5jMTq2NTlKRRRXppUwREjJ0
ryb15pbiB7C0/Bz/L4MCQC1AOKKjnqQEpINatjZLkyay0bXBih9GXovz3T1eAxaS
QOEzIC+hGjX+2x1z5jUwwKCgjVUaZdrx470SMJM2Js8=
-----END RSA PRIVATE KEY-----';
 
 
 
// 公鑰一般存放在登錄頁面中的一個隱藏域中,但是請注意:公鑰和私鑰一定要配對,且必須保證私鑰的安全
$public_key = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCBWNoG5LJ3u44Gs8PWs1MaNUQQ
+mOmh+9zWdzSt3ORbmfCDvU+ssW/6QTTgXvWWx7+Wzq/a4fCCQp72zSqXeVhWkTV
ct9Hyp/iMo5K6qOEK76z9z+tP/u99X6qazeXGVMWKkPiyZT4mKAGd/U8Mph9Z1Z5
kOluA7g7heq8PPlE9wIDAQAB
-----END PUBLIC KEY-----';
 
/**
  * 使用PHP OpenSSL時,最好先看看手冊,了解如何開啟OpenSSL 和 其中的一些方法的使用
  *  具體如何使用這里不做贅述,大家去看看PHP手冊,什么都就解決了
  */
$pi_key =  openssl_pkey_get_private($private_key); //這個函數可用來判斷私鑰是否是可用的,可用返回資源id Resource id 
$pu_key = openssl_pkey_get_public($public_key); //這個函數可用來判斷公鑰是否是可用的 
 
$decrypted = ""
openssl_private_decrypt(base64_decode($input[ 'username' ]),$decrypted,$pi_key); //私鑰解密 
// 這里的這個 $decrypted就是解密客戶端發送過來的用戶名,至於后續連接數據庫驗證登錄信息的代碼,這里也就省略了
echo json_encode($decrypted);

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM