RSA演算法在Python Django中的簡單應用
說明
RSA演算法是當今使用最廣泛,安全度最高的加密演算法。
• RSA演算法的安全性理論基礎
[引]根據百科介紹,對極大整數做因數分解的難度決定了RSA演算法的可靠性。換言之,對一極大整數做因數分解愈困難,RSA演算法愈可靠。假如有人找到一種快速因數分解的演算法的話,那麼用RSA加密的資訊的可靠性就肯定會極度下降。但找到這樣的演算法的可能性是非常小的。今天只有短的RSA鑰匙才可能被強力方式解破。到目前為止,世界上還沒有任何可靠的攻擊RSA演算法的方式。只要其鑰匙的長度足夠長,用RSA加密的資訊實際上是不能被解破的。
• RSA演算法使用
- 通常使用公鑰進行加密,使用私鑰進行解密。
- 如上所說,鑰匙的長度儘量設定長一些,在實際應用過程中,通常設定為1024或2048
• 在Python Django中簡單應用RSA演算法
以下是RSA在Python Django中的簡單應用例項
• 安裝pycrypto加密演算法庫
下載pycrypto-2.6.1.tar.gz並解壓,使用python setup.py install進行安裝即可,執行from Crypto.PublicKey import RSA無報錯,則說明安裝成功
• 生成祕鑰對
1.通過以下程式碼得到公鑰和私鑰
from Crypto import Random from Crypto.PublicKey import RSA random_generator = Random.new().read rsa = RSA.generate(1024, random_generator) rsa_private_key = rsa.exportKey() rsa_public_key = rsa.key().exportKey()
以上程式碼,rsa_private_key就是生成的公鑰,格式如下:
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
rsa_public_key 就是生成的私鑰,格式如下:
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
2.把生成的祕鑰對儲存在配置檔案中
• 在Django表單中使用公鑰對資訊進行加密
1.user.py
from django.conf import settings public_key = settings.RSA_PUBLIC_KEY kwargs = { 'public_key' : public_key, } return render(request, 'accounts/login.html', kwargs)
2.login.html
2.1 引入js
<script src="/static/js/jsencrypt.min.js"></script>
2.2 頁面form表單部分
<form class="form-horizontal" role="form" id="login_form" action="{% url "login" %}" method="POST" > <div class="box-body"> {% csrf_token %} <div class="form-group"> <label class="control-label col-md-3">賬號:</label> <div class="col-sm-12"> <input type="text" class="form-control" id="user_name" name="user_name" value=""> </div> </div> <div class="form-group"> <label class="control-label col-md-3">密碼:</label> <div class="col-sm-12"> <input type="password" class="form-control" name="password" id="password" value="" onKeyPress="keypress(event)"> </div> </div> {% for item in form %} <div class="text-left"> <div class="col-md-offset-1 col-md-10"> {{item.errors}} {{error_msg}} </div> </div> {% endfor %} <input type="hidden" name="public_key" id="public_key" value="{{ public_key }}"> </div> <div class="box-footer"> <input type="hidden" name="next" value="{{ next }}" /> <input style="width: 340px;" type="submit" class="btn btn-info pull-right submit" onfocus="this.blur()" onclick="doLogin()" value="登入" > </div> </form>
2.3 js部分
<script type="text/javascript"> function doLogin() { var password_old = document.getElementById("password").value; var encrypt = new JSEncrypt(); encrypt.setPublicKey($('#public_key').val()); var password_new = encrypt.encrypt(password_old); document.getElementById("password").value = password_new; login_form.submit(); } </script>
• 在Django後臺中使用私鑰對前端POST的加密資訊進行解密
from Crypto import Random from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5, PKCS1_OAEP from django.conf import settings import base64 random_generator = Random.new().read RSA.generate(1024, random_generator) rsakey = RSA.importKey(settings.RSA_PRIVATE_KEY) cipher = PKCS1_v1_5.new(rsakey) password = cipher.decrypt(base64.b64decode(password), random_generator)
以上程式碼,password則為解密後的資料