亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Flask框架實現的前端RSA加密與后端Python解密功能詳解

系統 5428 0

本文實例講述了Flask框架實現的前端RSA加密與后端Python解密功能。分享給大家供大家參考,具體如下:

 前言  

在使用 Flask 開發用戶登錄API的時候,我之前都是明文傳輸 username 和 password。這種傳輸方式有一定的安全隱患,password 可能會在傳輸過程中被竊聽而造成用戶密碼的泄漏。

那么我認為解決該問題的方法是這樣的:在前端頁面對數據進行加密,然后再發送到后端進行處理。

這一篇文章是前端用 RSA 的 publicKey 進行加密,然后后端用 Python 進行解密的示例。

 工具列表  

  • 后端:Python3

    • Flask

    • PyCrypto(PyCrytodome)

  • 前端

    • jsencrypt.js

后端使用Cryptodome庫進行密鑰的生成和解密,前端則使用jsencrypt.js庫進行加密。

 閱讀提醒  

本文主要是提供前端RSA加密后端Python解密代碼示例,不會做太詳細的說明,也不會有代碼打包下載鏈接,原理與步驟請細讀示例代碼或查閱相關資料。

 后端  

下面首先說明Python后端所用到的工具。

 PyCrypto和PyCrytodome  

PyCrypto 可能是 Python 中密碼學方面最有名的第三方軟件包。可惜的是,它的開發工作于2012年就已停止。幸運的是,有一個該項目的分支取代了 PyCrypto ,那就是 PyCrytodome。

Linux下安裝命令:

pip install pycryptodome

Windows下安裝命令:

pip install pycryptodomex

 PyCrytodome使用示例  

安裝好 pycryptodome 后,下面放上示例代碼          RSA_demo.py            。

#!/usr/bin/env python3
# coding=utf-8
# Author: yannanxiu
"""
create_rsa_key() - 創建RSA密鑰
my_encrypt_and_decrypt() - 加密解密測試
"""
from Cryptodome.PublicKey import RSA
from Cryptodome.Cipher import PKCS1_OAEP, PKCS1_v1_5
def create_rsa_key(password="123456"):
  """
  創建RSA密鑰
  步驟說明:
  1、從 Crypto.PublicKey 包中導入 RSA,創建一個密碼
  2、生成 1024/2048 位的 RSA 密鑰
  3、調用 RSA 密鑰實例的 exportKey 方法,傳入密碼、使用的 PKCS 標準以及加密方案這三個參數。
  4、將私鑰寫入磁盤的文件。
  5、使用方法鏈調用 publickey 和 exportKey 方法生成公鑰,寫入磁盤上的文件。
  """
  key = RSA.generate(1024)
  encrypted_key = key.exportKey(passphrase=password, pkcs=8,
                 protection="scryptAndAES128-CBC")
  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())
def encrypt_and_decrypt_test(password="123456"):
  # 加載公鑰
  recipient_key = RSA.import_key(
    open("my_rsa_public.pem").read()
  )
  cipher_rsa = PKCS1_v1_5.new(recipient_key)
  en_data = cipher_rsa.encrypt(b"123456")
  print(len(en_data), en_data)
  # 讀取密鑰
  private_key = RSA.import_key(
    open("my_private_rsa_key.bin").read(),
    passphrase=password
  )
  cipher_rsa = PKCS1_v1_5.new(private_key)
  data = cipher_rsa.decrypt(en_data, None)
  print(data)
if __name__ == '__main__':
  # create_rsa_key()
  encrypt_and_decrypt_test()

其中          create_rsa_key()            為創建密鑰對,          encrypt_and_decrypt_test()            為加密解密的測試,用起來很簡單對吧?

既然知道如何在Python端解密數據了,那么下面就是前端的代碼:

 前端  

前端所用到的主要工具是          jsencrypt.js            。

 jsencrypt.js簡介  

jsencrypt.js            是一個提供RSA加密、解密和密鑰生成的JS庫。其使用方式也非常簡單。在其官網就有給出示例代碼。

 Flask工程示例  

Python后端          

新建一個Python腳本,取名為          rsa_flask_demo.py            ,把下面代碼復制過去。

#!/usr/bin/env python3
# coding=utf-8
# Author: yannanxiu
import os
from flask import Flask, render_template, request, current_app
from Cryptodome.PublicKey import RSA
from Cryptodome.Cipher import PKCS1_OAEP, PKCS1_v1_5
import base64
from urllib import parse
# 獲取當前路徑
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")
app = Flask(__name__)
def decrypt_data(inputdata, code="123456"):
  # URLDecode
  data = parse.unquote(inputdata)
  # base64decode
  data = base64.b64decode(data)
  private_key = RSA.import_key(
    open(curr_dir + "/my_private_rsa_key.bin").read(),
    passphrase=code
  )
  # 使用 PKCS1_v1_5,不要用 PKCS1_OAEP
  # 使用 PKCS1_OAEP 的話,前端 jsencrypt.js 加密的數據解密不了
  cipher_rsa = PKCS1_v1_5.new(private_key)
  # 當解密失敗,會返回 sentinel
  sentinel = None
  ret = cipher_rsa.decrypt(data, sentinel)
  return ret
@app.route('/', methods=["GET", "POST"])
def rsa():
  public_key = None
  if "GET" == request.method:
    with open(public_key_file) as file:
      public_key = file.read()
  elif "POST" == request.method:
    username = request.values.get("username")
    password = request.values.get("passwd")
    current_app.logger.debug("username:" + username + "\n" + "password:" + password)
    # decrypt
    username_ret = decrypt_data(username)
    password_ret = decrypt_data(password)
    if username_ret and password_ret:
      current_app.logger.debug(username_ret.decode() + " " + password_ret.decode())
  return render_template("rsa_view.html", public_key=public_key)
@app.route('/js_rsa_test', methods=["GET", "POST"])
def js_rsa_test():
  return render_template("js_rsa_test.html")
if __name__ == '__main__':
  app.run(debug=True)

把          rsa_flask_demo.py            與前面的          RSA_demo.py            腳本放在一起,再用          RSA_demo.py            生成一組密鑰對。或者把前面生成密鑰對文件放在同一個目錄下也可以。

前端代碼          

在同一目錄下新建一個templates文件夾,用來存放Flask的前端模板。

在templates文件夾新建          rsa_view.html            ,并拷貝下面代碼過去,該HTML文件與Flask中的          rsa()            相對應。

[object Object]

運行          rsa_flask_demo.py            ,訪問          http://127.0.0.1:5000/            ,即可看到下面頁面。直接點擊submit按鈕即可。

張軍博客

當后臺頁面打印:

--------------------------------------------------------------------------------
DEBUG in rsa_flask_demo [F:/Flask/RSA_Flask/rsa_flask_demo.py:57]:
user 123
--------------------------------------------------------------------------------

即說明解密成功!

其他          

rsa_flask_demo.py            中的          js_rsa_test()            為JS腳本測試頁面,其對應的HTML代碼如下:

[object Object]

啟動服務后訪問          http://127.0.0.1:5000/js_rsa_test            即可。代碼內容主要是先用          jsencrypt.js            加密數據,再進行解密,如果成功則彈出It works!!!對話框。不傳輸數據到后臺,僅僅作為前端測試。

目錄結構          

│  my_private_rsa_key.bin
│  my_rsa_public.pem
│  RSA_demo.py
│  rsa_flask_demo.py

└─templates
        js_rsa_test.html
        rsa_view.html

 PS:關于加密解密感興趣的朋友還可以參考本站在線工具:  

 在線RSA加密/解密工具:              
 
 http://tools.jb51.net/password/rsa_encode          

 文字在線加密解密工具(包含AES、DES、RC4等):              
http://tools.jb51.net/password/txt_encode          

 MD5在線加密工具:              
 
 http://tools.jb51.net/password/CreateMD5Password

 在線散列/哈希算法加密工具:              
 
 http://tools.jb51.net/password/hash_encrypt

 在線MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:              
 
 http://tools.jb51.net/password/hash_md5_sha

 在線sha1/sha224/sha256/sha384/sha512加密工具:              
 
 http://tools.jb51.net/password/sha_encode

希望本文所述對大家基于flask框架的Python程序設計有所幫助。

 


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: www.欧美成人 | 国产这里有精品 | 久色伊人| 亚洲高清视频在线 | 天天草夜夜操 | 9久久这里只有精品国产 | 九九黄色网 | 亚洲国产天堂在线mv网站 | 精品一级毛片 | 欧美性猛交ⅹxxx乱大交免费 | 亚洲成人免费视频在线 | 国产精品第8页 | 久久久国产精品免费看 | 青青青青久在线观看视频 | 国产边打电话边被躁视频 | 国产成人精品亚洲日本在线观看 | 国产乱码在线精品可播放 | 亚洲精品第一区二区在线 | 看看的在线视频国产 | 国产精品久久久久国产精品 | 91视频网页| 看欧美毛片一级毛片 | 色婷婷在线观看视频 | 亚洲婷婷丁香 | 亚洲a视频在线 | 日韩免费毛片 | 99久久免费精品国产免费 | 国产69精品久久久久99尤物 | 国产一国产一级毛片视频 | 日本一区不卡视频 | 国产亚洲精品久久久久久久软件 | 免费国产视频在线观看 | 91国内精品久久久久免费影院 | 国内精品视频九九九九 | 深夜福利在线免费观看 | 日本大片免费一级 | 国产精品欧美日韩精品 | 男女超爽视频免费播放在线观看 | 中国性孕妇xxxxxxxx孕交 | 国产精品亚洲综合一区在线观看 | 国产午夜亚洲精品国产 |