【Python】itsdangerous在Django中加密解密的使用

起因

我們知道HTTP是不安全的,所以在Django中,爲了加密傳輸的數據(可以是密碼、郵件、URL,類型可以是字符串、JSON、列表等等),可以使用itsdangerous進行加密和解密數據。

如加密一個URL的參數。

使用itsdangerous可以很方便的讓我們進行可逆的加密解密。

安裝

pip install itsdangerous

JSON Web Signature (JWS)

文檔:https://itsdangerous.palletsprojects.com/en/1.1.x/jws/

1. 有過期時間的簽名——TimedJSONWebSignatureSerializer

未過期時可以解密

In[1]:from itsdangerous import TimedJSONWebSignatureSerializer # 導入時間JSON簽名序列化包
In[2]:serializer1 = TimedJSONWebSignatureSerializer(secret_key='secret-key', expires_in=3600)    # 密鑰和過期時間
In[3]:info = {'content':9527}   # JSON,也可以是list類型、字符串類型
In[4]:res = serializer1.dumps(info) # 加密
In[5]:res
Out[5]: b'eyJhbGciOiJIUzUxMiIsImlhdCI6MTU5MDE1MDQ0MywiZXhwIjoxNTkwMTU0MDQzfQ.eyJjb250ZW50Ijo5NTI3fQ.SyIcvnG8yOHPA1teNhK3htc50WgWHJxA9-4-6DS0Zlk4Q4zWV5GKUAv2axmhio4ry0YdQls5Lc1eoIZDR8Cvdw'
In[6]:serializer1.loads(res)    # 解密
Out[6]: {'content': 9527}

過期後解密會報錯

In[7]:serializer1 = TimedJSONWebSignatureSerializer(secret_key='secret-key', expires_in=1) # 1秒後過期
In[8]:res = serializer1.dumps(info)
In[9]:serializer1.loads(res)
Traceback (most recent call last):
  File "D:\Python3.7.5\lib\site-packages\IPython\core\interactiveshell.py", line 3319, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-26-9a4867386e07>", line 1, in <module>
    serializer1.loads(res)
  File "D:\Python3.7.5\lib\site-packages\itsdangerous\jws.py", line 205, in loads
    date_signed=self.get_issue_date(header),
itsdangerous.exc.SignatureExpired: Signature expired

2. 可以加salt的簽名——JSONWebSignatureSerializer

什麼叫salt呢?salt鹽,其實就是由服務器隨機生成的一個字符串,但是要保證長度足夠長,並且是真正隨機生成的。然後把它和密碼字符串相連接(任意規則連接)生成散列值。當兩個用戶使用了同一個密碼時,由於隨機生成的salt值不同,對應的散列值也將是不同的。這樣一來,很大程度上減少了密碼特徵,攻擊者也就很難利用自己手中的密碼特徵庫進行破解。

——《圖解HTTP》

提醒:

  1. HTTP傳輸時,爲了使數據更安全,可以加salt(隨機字符串)再散列。
  2. isdangerous中,鹽其實就是一個附加字符串,可以區別用途:
In[1]:from itsdangerous.url_safe import URLSafeSerializer
In[2]:s1 = URLSafeSerializer("secret-key", salt="activate")   # 激活賬戶
In[3]:s1.dumps(42)
Out[3]:'NDI.MHQqszw6Wc81wOBQszCrEE_RlzY'
In[4]:s2 = URLSafeSerializer("secret-key", salt="upgrade")    # 升級賬戶
In[5]:s2.dumps(42)
Out[5]:'NDI.c0MpsD6gzpilOAeUPra3NShPXsE'

實際使用

In[1]:from itsdangerous import JSONWebSignatureSerializer
In[2]:s = JSONWebSignatureSerializer("secret-key", salt="Jc$@85idhhg1^&")
In[3]:res = s.dumps({"x": 42})
In[4]:res
Out[4]:'eyJhbGciOiJIUzI1NiJ9.eyJ4Ijo0Mn0.ZdTn1YyGz9Yx5B5wNpWRL221G1WpVE5fPCPKNuc6UAo'
In[5]:s.loads(res)
Out[5]: {'x': 42}
In[6]:s.dumps('1233145')
Out[6]: b'eyJhbGciOiJIUzUxMiJ9.IjEyMzMxNDUi.3bDpp2x73YsS4w6p_5Dg_4sgO49iJyWCjZsiFIdLczjawsxVVH99Rszkc9qixMfD1BxIxJmtQRcUJrimQrCKyg'
In[7]:s.loads(b'eyJhbGciOiJIUzUxMiJ9.IjEyMzMxNDUi.3bDpp2x73YsS4w6p_5Dg_4sgO49iJyWCjZsiFIdLczjawsxVVH99Rszkc9qixMfD1BxIxJmtQRcUJrimQrCKyg')
Out[38]: '1233145'

還有其他的:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章