[ 使用rsa加密pwd ]


前端使用js, 后端django

1.安装

pip install pycryptodomex

2. python后端内容

create_rsa_key.py

"""
create_rsa_key() - 创建RSA密钥
"""
from Cryptodome import Random

from Cryptodome.PublicKey import RSA
def create_rsa_key():
    """
    创建RSA密钥
    步骤说明:
    1、从 Crypto.PublicKey 包中导入 RSA,创建一个密码
    2、生成 1024/2048 位的 RSA 密钥
    3、调用 RSA 密钥实例的 exportKey 方法,传入口令、使用的 PKCS 标准以及加密方案这三个参数。
    4、将私钥写入磁盘的文件。
    5、使用方法链调用 publickey 和 exportKey 方法生成公钥,写入磁盘上的文件。
    """
    # 利用伪随机数来生成私钥和公钥
    random_generator = Random.new().read

    key = RSA.generate(2048,random_generator) #生成 1024/2048 位的 RSA 密钥
    encrypted_key = key.exportKey() #密钥实例
    with open("my_private_rsa_key.bin", "wb") as f:#私钥写入磁盘
        f.write(encrypted_key)
    with open("my_rsa_public.pem", "wb") as f: #公钥写入磁盘
        f.write(key.publickey().exportKey())

if __name__ == '__main__':
    create_rsa_key()

decrypt_key.py

import os
from Cryptodome.PublicKey import RSA
from Cryptodome.Cipher import  PKCS1_v1_5
import base64
from urllib import parse
from django.shortcuts import render
from django.http import *

# 当前路径钥匙地址
curr_dir = os.path.dirname(os.path.realpath(__file__))
private_key_file = os.path.join(curr_dir, "my_private_rsa_key.bin") #密钥
public_key_file = os.path.join(curr_dir, "my_rsa_public.pem")  #公钥

#解码
def decrypt_data(inputdata):
    # URLDecode
    data = parse.unquote(inputdata)
    # base64decode
    data = base64.b64decode(data)
    # 读取密钥
    private_key = RSA.import_key(
        open(curr_dir + "/my_private_rsa_key.bin").read())
    # 使用 PKCS1_v1_5解密
    cipher_rsa = PKCS1_v1_5.new(private_key)
    # 当解密失败,会返回 sentinel
    sentinel = None
    ret = cipher_rsa.decrypt(data, sentinel)
    return ret.decode() #解码

#自定义注解 过滤GET和POST请求解码 。
def ouou_decode(fun):
    def check(request,*args,**kwargs):
        if "GET" == request.method:
            request.GET = request.GET.copy() #request设置可以修改
            for  i  in  list(request.GET):
                request.GET[i] = decrypt_data(request.GET[i])#解码
        elif "POST" == request.method:
            request.POST = request.POST.copy()
            for  i  in  list(request.POST):
                request.POST[i] = decrypt_data(request.POST[i])
        return fun(request, *args, **kwargs)
    return check

3.生成的私钥(my_private_rsa_key.bin) ,公钥(my_rsa_public.pem)

私钥:my_private_rsa_key.bin

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAycZ2UfsZhU6pNfkAXqQyp6QHSKapyDK/6eQk2nsY2cMlJWMf
PJBA3Y3aXkRzdK3B7eFBQ9EAILNY2fKiIszBb5I9YOuhHWkD1kUOY8O8Bc7/dhsj
26aNcDvS7d6KoyuxjIYBiWiEYeVyLJevivPMu/VpUREjv9FwyfHHKwLEb1zdJS1F
yb0D/XDjzNsGR6/oyXoRmk4KgHSKEYDlgrao/01pZcNnvJDvqJIqlZJWyvfNPUiz
7mlGPPq7hUt+xPNiCOBKfaK2u6D/v/vF79kPkbbWLDNfZNVQMou0Ib0e37CZABr7
tHjgRglLfyvz4Uj4S1j0gIzn1CkhfLZuWlxvPwIDAQABAoIBABnsJl1SmNfDNa1a
cngLjk/H8gDycH4+OYuvT3tw3yNy6mh1kJjI9kcV0gfUXCTnAd2G1/Ss0DW4n4yj
Rb3vd6vW1OMzwnzdy1a8LnoWC9I54stl9zhhRcCKibHHqnYGHLGvXFkulVC3wpsE
rdJ4j0VX5RI7f8/v9MFCZP0bRj4BgfSxqcXUqEVK8Ch26Fvojw4pENmdOaulu6PR
evt3gZ9uWQoXA6SwN+srMAHr1p62DngFQvEPRIG663aDP4IAIfCrFtZIJX/qBuZp
KFEvPZOMR37ep1WqQnWqmCCWv4TyZTswuVDk0Y6k37w+SgeeL4C4hM2zdMPlruF+
qEdmh7kCgYEA0R38UAQ1zks77XTWGZpS0+IfvEn4bG94ylTklO0OGDR/HDdbm2SY
QGCeuWUY5M5Us8m2NBJhrLEIGQIFL1wnTrbM+hOVYuIHz3NdQy8ClK2e2y6Zm5U/
Q+iYEK1UtwU+fziWBMqhs2aOhbyZn6H4tVVz1gqSk0XzbWnuVEbgbK0CgYEA9wMZ
IOvqpru6OU29h1+R4EAz5qjSIza2wFP+U4kWGhplnOZnn7fXtQvWR0SGr3WOuPvy
aHp5U+ONSgA1HEfmVknirl/tfXEztmmfsdcY+6mhFd02+6KJyn6kVqA3ELEBm14y
pIw6xLOU+FccA9GbEHiGPUuDsjEyhxvtZTmy/RsCgYBfOHo1rVUa1KM7IyKCkgT5
OlQdFsmqBrBH4ZQcRD1QxEbFAGgUQCAb4GMmJGTLezCSlV0EJQKY8huv132o7Rtw
+kgn71bsqePIkM181CEmtlBJmdSURceDEpx7q5GRrS+iGpAlKmerGx32w8RoLgbj
+z89zZ6ktQt9XOkLMyLqGQKBgQDBm8QOcduyZGJKmAx+FwKX6rrDiH9s6m3DwhIO
F90jCJ2spUuDfO2uEmEZ6zRGQrZjd9dA3P5MKoeMAS2fxRtddvweAUJ8mEYYLCHn
mtkSKJsCMCnwgi3OcgUNgPaoNpUz2lmHcAKAOuIA5QYoWBpahp1xXccT3EvmapVg
SiFpEQKBgEvaNFPs2dksZ8D71wdKX8V/tUU2wH9nI9KV94OSd95p0ZvPRKYHAQyj
jnLO396K3wEzFKZVp+G5GI0ETDXyX/JG01zKqje331mgKxR4SVOtgqt8G0F8z/+E
Bqoc4rKb9mmOnsEocFYW9OUEq/1BuTNPKB/FdcrTdruxqeU8BWjd
-----END RSA PRIVATE KEY-----

公钥:my_rsa_public.pem

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAycZ2UfsZhU6pNfkAXqQy
p6QHSKapyDK/6eQk2nsY2cMlJWMfPJBA3Y3aXkRzdK3B7eFBQ9EAILNY2fKiIszB
b5I9YOuhHWkD1kUOY8O8Bc7/dhsj26aNcDvS7d6KoyuxjIYBiWiEYeVyLJevivPM
u/VpUREjv9FwyfHHKwLEb1zdJS1Fyb0D/XDjzNsGR6/oyXoRmk4KgHSKEYDlgrao
/01pZcNnvJDvqJIqlZJWyvfNPUiz7mlGPPq7hUt+xPNiCOBKfaK2u6D/v/vF79kP
kbbWLDNfZNVQMou0Ib0e37CZABr7tHjgRglLfyvz4Uj4S1j0gIzn1CkhfLZuWlxv
PwIDAQAB
-----END PUBLIC KEY-----

4.前端html-js

test.html

<!doctype html>
<html>

<head>
  <title>JavaScript RSA Encryption</title>
  <script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
  <script src="http://passport.cnblogs.com/scripts/jsencrypt.min.js"></script>
  <script type="text/javascript">

    $(function () {

      $('#testme').click(function () {
        // 用公钥加密
        var encrypt = new JSEncrypt();
        encrypt.setPublicKey($('#pubkey').val()); // 获取输入的公钥
        var encrypted = encrypt.encrypt($('#input').val()); // 获取输入 (需要进行加密内容)
        alert('加密成功!!' + encrypted);
        console.log("加密成功密钥:");
        console.log(encrypted);

        // 使用私钥解密
        var decrypt = new JSEncrypt();
        decrypt.setPrivateKey($('#privkey').val()); // 获取输入的私钥
        var uncrypted = decrypt.decrypt(encrypted); // 输入加密后的内容

        if (uncrypted == $('#input').val()) {
          alert('前台 解密成功!!' + uncrypted);
        } else {
          alert('解密失败!!');
        }

        // 模拟发起请求,发送加密后的内容到后端 
        //    encryptRequest('/json', encrypted);
      });
    });

    // 使用jsencrypt类库加密js方法,
    // function encryptRequest(reqUrl, data) {
    //     $.ajax({
    //         url: reqUrl,
    //         type: 'get',
    //         data: {"data":data},
    //         success: function (data) {
    //             alert("后台!解密成功 !!!"+data);
    //         },
    //         error: function (xhr) {
    //             {#//console.error('出错了');#}
    //         }
    //     });
    // }
  </script>
</head>

<body style="width: 1080px;margin: 0 auto">

  <label for="privkey">密钥</label><br />
  <textarea id="privkey" rows="15" cols="65">{{ private_key }}</textarea><br />
  <label for="pubkey">公钥</label><br />
  <textarea id="pubkey" rows="15" cols="65">{{ public_key }}</textarea><br />

  <label for="input">Text to encrypt:</label><br />
  <textarea id="input" name="input" type="text" rows=4 cols=70>This is a test!</textarea><br />
  <input id="testme" type="button" value="Test Me!!!" /><br />
</body>

</html>