zoukankan      html  css  js  c++  java
  • 登录页面之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);

     

  • 相关阅读:
    根据表1更新表2的数据
    sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表
    sql server 2008 将某表里的数据随机插入另一个表表
    用SqlBulkCopy批量插入数据
    Win7 下如何添加任务计划呢
    20180320作业1:源代码管理工具调查 Polonium
    判断传入的电子邮箱账号的正确性 Polonium
    Java工厂方法模式 Polonium
    软工课后作业01 Polonium
    Java实现简单工厂模式
  • 原文地址:https://www.cnblogs.com/gutianer/p/7081598.html
Copyright © 2011-2022 走看看