Django 加密 url 中的主键

2024-01-12

我环顾四周,但仍然对如何安全地加密 django 应用程序的 url 中的主 ID 感到不舒服。

我的网址如下:

http://www.example.com/primary1_id/primary2_id/testing/

例如:

http://www.example.com/3/7/testing/

我想向用户显示上述网址,如下所示:

http://www.example.com/623477897ghfjs23879/7829yfgweh/testing/ #encrypted key instead of primary id

在我看来,我应该能够从加密密钥中解码回primary1_id和primary2_id

请我需要一些关于如何以最佳方式处理它的指导

提前致谢!


我写了一个库来帮助你做到这一点:django-加密-id https://github.com/amitu/django-encrypted-id。这是一个示例模型:

from django.db import models

from encrypted_id.models import EncryptedIDModel


class Foo(EncryptedIDModel):
    text = models.TextField()

通过从 EncryptedIDModel 继承,您可以将 .ekey 作为模型实例的属性。它们看起来是这样的:

In [1]: from tapp.models import Foo

In [2]: f = Foo.objects.create(text="asd")

In [3]: f.id
Out[3]: 1

In [4]: f.ekey
Out[4]: 'bxuZXwM4NdgGauVWR-ueUA..'

您可以进行反向查找:

In [5]: from encrypted_id import decode

In [6]: decode(f.ekey)
Out[6]: 1

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

In [7]: from encrypted_id import ekey

In [8]: from django.contrib.auth.models import User

In [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: Foo object>

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

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

其工作原理相同,但它不是引发DoesNotExist,而是引发Http404,因此它可以在视图中使用。

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

In [12]: e = ekey(User.objects.first())

In [13]: e
Out[13]: 'bxuZXwM4NdgGauVWR-ueUA..'

In [14]: get_object_or_404(User, e)
Out[14]: <User: amitu>

cryptod_id.get_object_or_404 以及 EncryptedIDManager.get_by_ekey 和 EncryptedIDManager.get_by_ekey_or_404 采用额外的关键字参数,如果需要,可用于过滤。

如果您好奇的话,用于匹配生成的 id 的正则表达式是:

"[0-9a-zA-Z-_]+.{0,2}"

如果您正在使用智能网址 http://amitu.com/smarturls/,您可以使用 URL 模式,例如:

"/<ekey:foo>/"

我建议使用 crypto-id 而不是 UUID,因为 UUID 有一些值得考虑的重大问题 https://stackoverflow.com/questions/45399/advantages-and-disadvantages-of-guid-uuid-database-keys(tldr:它们在磁盘和 RAM 上占用更多空间,并且索引比整数 id 差),如果您的目标只是使 URL 不可猜测,那么加密 id 是一种更好的方法。

如果您对所使用的加密感到好奇:我正在使用 pycrypto 库中的 AES,并在 AES.CBC 模式下使用 SECRET_KEY 作为密码 (SECRET_KEY[:24]) 和 IV (SECRET_KEY[-16:])。一般来说,建议不要使用静态 IV,但 CBC 弥补了静态 IV 带来的一些问题。您问的静态 IV 有什么问题:如果纯文本“abc”和“abe”被加密,则前两个字节将是相同的。现在这对我们来说并不是一个严重的问题,因为我正在加密的纯文本在有效负载的开头使用 CRC32,所以即使你有 ids、1、11,攻击者也不能说它们都以相同的第一个字符开头。

该库还支持由于某种原因必须循环使用 SECRET_KEY 的情况,因此使用旧 SECRET_KEY 加密的 URL 在更改后仍然可以解码(只要您在 SECRET_KEYS 设置中存储旧版本)。为了解密,库会尝试每个秘密密钥,并比较数据的 CRC32,以确保我们已正确解密(就像事物中的情况一样)。

请随时提出问题加密 ID github 存储库 https://github.com/amitu/django-encrypted-id,如果您遇到任何问题,我很乐意提供帮助。该库支持 python 2.7 和 3.5,以及 django 团队支持的所有 django 版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 加密 url 中的主键 的相关文章

随机推荐

  • 如何求解稀疏矩阵的线性方程 AX=b

    我有稀疏矩阵 A 120 000 120 000 和向量 b 120 000 我想使用 Eigen 库求解线性系统 AX b 我尝试按照文档进行操作 但总是出现错误 我还尝试将矩阵更改为稠密并求解系统 Eigen MatrixXd H N
  • 由 find_or_create_by_ 创建的重复记录

    我有一个 ActiveRecord 对象 Corporation 我的项目中创建该对象实例的唯一调用如下所示 corp Corporation find or create by eveid and user id self corpora
  • 我可以在Windows下改变python ttk组合框的颜色吗?

    我在 Linux 下得到了工作代码 用于更改 python 2 7 下 Ttk 的 TCombobox 的外观 如果我在windows下运行代码 它不会工作 我知道 ttk 小部件的颜色和属性是依赖于平台的 我仍然不知道如何更改 Windo
  • 未找到 MY_Controller 类

    我想解决的主要问题是当有人想要访问管理面板时检查用户会话 我已经创建了 MY Controller 类并将其放入库中 class MY Controller extends CI Session public logged in FALSE
  • Android Viewpager EdgeEffect自定义颜色

    我正在尝试在我的应用程序的 Viewpager 中自定义 EdgeEffect 目的是用定制的红色 ics Overscroll EdgeEffect 替换蓝色 ics Overscroll EdgeEffect 所以一开始我编辑了过度滚动
  • cuda 3D纹理插值

    我正在尝试使用纹理内存和下面的代码通过 cuda 插入 3D 数组 我已将输入 f x y z 绘制为固定的 z 值 然后为 x 和 y 插入数组并再次绘制 i 它们看起来完全不同 我还在一维中尝试过这个 使用不同的代码 并且它在那里工作
  • 如何处理 UsernameNotFoundException spring security

    如何处理UsernameNotFoundException 在 Spring Security 中 当用户名未找到时UserDetailsService实现抛出一个UsernameNotFoundException 例如这样 Overrid
  • 将 UIDatePicker 从 12 小时制更改为 24 小时制并返回

    很抱歉 我的第一个问题有点简单 我花了一天时间阅读 NSLocale 和 NSCalendar 类描述 但我不知道这是否可能 我有一个 UIDatePicker 处于 UIDatePickerModeDateAndTime 模式 当前它根据
  • Java 正则表达式中的 POSIX 字符等效项

    我想在Java中使用这样的正则表达式 a e i 但是Java不支持POSIX类 a e etc 我怎样才能做到这一点 更准确地说 有没有办法不使用 US ASCII Java确实支持posix 字符类 http download orac
  • 使用 micronaut-data-hibernate-jpa 库连接到 jpa 时出现错误

    我想将 JPA 用于 micronaut 为此我正在使用io micronaut data micronaut data hibernate jpa 1 0 0 M1图书馆 每当我运行应用程序并点击端点来获取数据时 我都会收到以下错误 me
  • Keycloak / SpringBoot - OpenID 配置中提供的颁发者 与请求的颁发者 不匹配

    我对我刚刚加入的项目有疑问 技术栈 Jhipster 与 Angular 和 SpringBoot Keycloak 我将正确的网址替换为 example com 和 bar com 应用程序 yaml https i stack imgu
  • Html.Action - 获取与发布

    我经常这样做 div Html Action Create Product div 这很方便 因为我可以将产品创建表单的绘制委托给另一个控制器操作以嵌入到某个位置 但是 我遇到的问题是 该方法有时 我还没有弄清楚在什么条件下 会调用我的控制
  • 我如何知道鼠标指针是否位于 HTML 元素上?

    我有一个定时事件 我想根据鼠标指针所在的 HTML 元素采取不同的行为 假设我有 HTML 元素 有没有办法知道鼠标指针当前是否位于其顶部 我很了解 onmouseover onmouseout 事件以及如何使用它们 我正在使用 JQuer
  • 多个外键?

    我有一张表 用于跟踪将产品从一个供应商运送到另一个供应商的天数和成本 我们 非常出色 p 将运输供应商 FedEx UPS 和产品处理供应商 Think Dunder Mifflin 存储在 VENDOR 表中 因此 我的 SHIPPING
  • 使用硬浮点时使用 gcc 交叉编译简单示例时出现问题

    当我尝试编译一个简单的例子时test c int main return 0 对于具有硬浮点 ABI 的 cortex m7 目标 使用以下调用 arm none eabi gcc mcpu cortex m7 mfpu fpv5 d16
  • 类型错误:res.json 不是函数

    我正在尝试发送两个 json 但它不起作用 它打印TypeError res json is not a function但我不明白为什么会发生 有什么想法吗 谢谢 app post danger function response req
  • GWT XML(xml 对象映射)

    在 Java 中 我们可以使用 JAXB 等工具自动为我们进行类对象映射 但是在 GWT 中 由于反射有限 JAXB 不可用 唯一的方法是 Document messageDom XMLParser parse messageXml Nod
  • 为什么在 CLOB 上使用 REPLACE 函数会导致 CACHE_LOBS 增加...?

    我需要在 CLOB 变量上使用内置 REPLACE 函数 作为更大的 PL SQL 流程的一部分 我使用的是 Oracle 11g R2 该函数工作正常 因为它根据需要进行替换 但随着过程运行 大约有 250 万条记录需要处理 它的速度严重
  • Prolog的append有什么问题?

    根据我大学的逻辑课程 对于以下查询 我们可以预期得到与 Prolog 定义不同的结果 append a X 统一为X a 但我不明白他们的目的是什么 考虑到附加应该统一 X 在本例中 的串联 应该期望什么作为有效响应 and a 我认为他们
  • Django 加密 url 中的主键

    我环顾四周 但仍然对如何安全地加密 django 应用程序的 url 中的主 ID 感到不舒服 我的网址如下 http www example com primary1 id primary2 id testing 例如 http www