django模型的加密id

django-encrypted-id的Python项目详细描述


注意:0.3.0版以后生成的加密ID将不同 从版本0.2.0生成的。但是版本0.3.x将解密ID 由0.2.0版生成。

注意:版本0.2.0是对版本的重大更改 0.1.x。 如果您一直在permalinks中使用ekey,那么建议您 不升级到0.2.x.


考虑这个示例模型:

fromdjango.dbimportmodelsfromencrypted_id.modelsimportEncryptedIDModelclassFoo(EncryptedIDModel):text=models.TextField()

通过继承EncryptedIDModel,可以将.ekey作为 模型实例。这就是他们的样子:

In[1]:fromtapp.modelsimportFooIn[2]:f=Foo.objects.create(text="asd")In[3]:f.idOut[3]:1In[4]:f.ekeyOut[4]:'bxuZXwM4NdgGauVWR-ueUA'Youcandoreverselookup:In[5]:fromencrypted_idimportdecodeIn[6]:decode(f.ekey)Out[6]:1

如果不能从helper基类继承,没问题,可以使用 来自encrypted_id包的ekey()函数:

In[7]:fromencrypted_idimportekeyIn[8]:fromdjango.contrib.auth.modelsimportUserIn[9]:ekey(User.objects.get(pk=1))Out[9]:'bxuZXwM4NdgGauVWR-ueUA'

要执行反向查找,您有两个助手可用。首先由提供 EncryptedIDManager,如果继承自 EncryptedIDModel,并且没有覆盖.objects

In[10]:Foo.objects.get_by_ekey(f.ekey)Out[10]:<Foo:Fooobject>

但有时您会更喜欢以下格式:

In[11]:Foo.objects.get_by_ekey_or_404(f.ekey)Out[11]:<Foo:Fooobject>

它的工作原理是相同的,但是它没有提高DoesNotExist,而是提高 Http404,因此可以在视图中使用。

您的经理不是从EncryptedIDManager继承的,您可以使用:

In[12]:e=ekey(User.objects.first())In[13]:eOut[13]:'bxuZXwM4NdgGauVWR-ueUA'In[14]:get_object_or_404(User,e)Out[14]:<User:amitu>

encrypted_id.get_object_or_404,以及 EncryptedIDManager.get_by_ekeyEncryptedIDManager.get_by_ekey_or_404接受额外的关键字参数,它可以 如果你想的话可以用来过滤。

如果您好奇,用于匹配生成的id的regex是:

"[0-9a-zA-Z-_]+"

如果您使用的是smarturls,则可以使用url 模式如下:

"/<ekey:foo>/"

我建议在uuid上使用加密id,因为uuid具有重要意义 应该考虑的问题(tldr:它们占用更多的磁盘和ram空间, 并且具有比整数ID低的索引,并且如果你的目标仅仅是 使url不可猜测,加密id是一种更好的方法。

如果您对使用的加密感到好奇:我正在使用AES,来自 pycrypto库,AM使用SECRET_KEY作为密码 (SECRET_KEY[:32])和IV(哈希的前16个字符$ 以及一个sub_key,在AES.CBCmode下。sub_键取自 模型的Meta属性ek_key,如果ek_key是 未设置。

一般来说,建议不要使用静态的IV,而是使用CBC偏移量 有静电的一些问题iv.静电有什么问题 如果纯文本“abc”和“abe”是加密的,那么前两个字节 会是一样的。现在这对我们来说并不是一个严重的问题,因为 我正在加密的纯文本在有效负载的开头使用CRC32,因此 即使你有ID,1,11,攻击者也不能说它们都是从同一个开始的 第一个字符。

库还支持必须循环^{tt15}的场景$ 由于某些原因,因此使用较旧的SECRET_KEY加密的url仍然可以 在您更改后解码(只要您将旧版本存储在 SECRET_KEYS设置)。为了解密,图书馆尝试每一个秘密 键,并将数据的CRC32进行比较,以确定(根据实际情况确定 在这种情况下),我们已经正确地解密了。

请在这里提出一个问题,如果你有任何问题,我会很高兴的 来帮忙。这个库同时支持Python2.7和3.5,以及所有这些 django团队支持的django版本。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在ArrayList中比较数字   java在Kotlin中使异步调用同步   让“Scala编程”junit示例在IntelliJ中工作的java问题   java Servlet侦听器未在ContextListener中设置属性   将Microsoft SQL Server数据库连接到我的Java项目   加载资源时出现java“需要注册工厂”异常   java如何使用POI检查excel中的重复记录?   java如何更改机器生成的代码   java如何确保重写的方法是同步的   用Spring编写Hibernate时的java XML奥秘   java管理mysql数据库中存储的用户权限   java如何运行。来自Javascript的jar方法   java我想在Web应用程序中进行身份验证&对桌面应用程序使用相同的凭据。我该怎么做?