相关文章推荐
阳刚的板凳  ·  postgresql - Rails: ...·  2 年前    · 

我们知道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).decode() # 加密
In[5]:res
Out[5]: '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').decode()
Out[6]: 'eyJhbGciOiJIUzUxMiJ9.IjEyMzMxNDUi.3bDpp2x73YsS4w6p_5Dg_4sgO49iJyWCjZsiFIdLczjawsxVVH99Rszkc9qixMfD1BxIxJmtQRcUJrimQrCKyg'
In[7]:s.loads('eyJhbGciOiJIUzUxMiJ9.IjEyMzMxNDUi.3bDpp2x73YsS4w6p_5Dg_4sgO49iJyWCjZsiFIdLczjawsxVVH99Rszkc9qixMfD1BxIxJmtQRcUJrimQrCKyg')
Out[38]: '1233145'

还有其他的:

起因我们知道HTTP是不安全的,所以在Django中,为了加密传输的数据(可以是密码、邮件、URL,类型可以是字符串、JSON、列表等等),可以使用itsdangerous进行加密和解密数据。如加密一个URL的参数。加密前:http://127.0.0.1/user/1233145加密后:http://127.0.0.1/user/eyJhbGciOiJIUzUxMiJ9.IjEyMzMxNDUi.3bDpp2x73YsS4w6p_5Dg_4sgO49iJyWCjZsiFIdLczjawsxVVH C.封装utils from itsdangerous import TimedJSONWebSignatureSerializer as Serializer from meiduo_mall import settings def generic_openid(openid): s = Serializer(secret_key=settings.SECRET_KE questions: itsdangerous用来解决什么问题,为什么需要用到itsdangerous安全加密解密: 1、使用没有逆运算的公式,只能加密不能解密。 2、可逆,能加密解密。保证安全性——私钥。 itsdangerous内部默认使用了HMAC和SHA1来签名,基于 Django 签名模块。它也支持JSON Web 签名 (JWS)。 itsdang...
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer serializer = Serializer('secretkey', 3600) info = {'confirm':1} res = serializer.dumps(info) Out[7]: b'eyJhbGciOiJIUzUxMiIsImlhdCI6MTYxMTIxODczOCwiZXhwIjoxNjExMjIyMzM4fQ.eyJjb25maX.
pip install Isdangerous ItsDangerous 默认使用 HMAC 和 SHA-512 进行签名。最初的实现受到 Django 的签名模块的启发。它还支持 JSON Web 签名**(JWS)**。该库是 BSD 许可的。 所以一般都说 Django 的 Isdangerous,清晰了吧。 # 因为实在是... 安装命令:pip install itsdangerous 有时候你想向不可信的环境发送一些数据,但如何安全完成这个任务呢?解决的方法就是签名。使用只有你自己知道的密钥,来加密签名你的数据,并把加密后的数据发给别人。当你取回数据时,你就可以确保没人篡改过这份数据。 诚然,接收者可以破译内容,来看看你的包裹... 2、在视图类导入itsdangerous模块和异常处理 from itsdangerous import TimedJSONWebSignatureSerializer as Serializer from itsdangerous import SignatureExpired # 异常 3、创建Tim... #明文加密传输 #更多相关知识请看https://itsdangerous.readthedocs.io/en/latest/ from itsdangerous import URLSafeSerializer s = URLSafeSerializer('secret-key') print s.dumps([1, 2, 3, 4...
在开发过程会遇到一些需要用户激活使用的链接,这些需要带有用户的相关信息,又不希望这些信息以明文的方式展现给用户,防止不放分子从作恶,这时就可以使用itsdangerous来对数据进行加密,之后再对加密的数据进行解密得到用户信息,从而对该用户进行激活认证 具体在开发过程使用: from itsdangerous import TimedJSONWebSignatureSeri...
pip install -U itsdangerous from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
为什么要用itsdangerous,是为了保证你的加密的数据没有被人修改,因为修改了就无法重新解出原数据,若超时了也无法解出内容,应用场景激活,发一个激活的网址给你,你若在一定时间内,未激活,会激活超时。 首先介绍下载pycharm的安装: 安装命令:pip install itsdangerous 有时你想向一个不可信的环境发送一些数据,如何保证安全呢,答案是签名,使用只有你自己知道的秘钥(...