Encryption 其中";“好”;块加密算法的输出最短?

Encryption 其中";“好”;块加密算法的输出最短?,encryption,Encryption,我想给客户一个随机的订单号,但使用0,1,2。。。在后端。这样,客户将获得一个带有加密订单号的无密码保护订单状态URL,并且他们无法通过加或减1查看其他客户的订单号。这可能会取代一种方案,在该方案中,生成随机顺序键,检查之前所有顺序中的唯一性,然后重新生成,直到唯一。当web服务器收到查看订单的请求时,它会解密订单号并检索订单 为了保持URL短,什么“好”的加密算法具有最短的块大小?这个计划好吗?(如果我加密了苹果公司的员工ID,以防止史蒂夫·乔布斯索要员工0号怎么办?) 请注意,所有包跟踪网站

我想给客户一个随机的订单号,但使用0,1,2。。。在后端。这样,客户将获得一个带有加密订单号的无密码保护订单状态URL,并且他们无法通过加或减1查看其他客户的订单号。这可能会取代一种方案,在该方案中,生成随机顺序键,检查之前所有顺序中的唯一性,然后重新生成,直到唯一。当web服务器收到查看订单的请求时,它会解密订单号并检索订单

为了保持URL短,什么“好”的加密算法具有最短的块大小?这个计划好吗?(如果我加密了苹果公司的员工ID,以防止史蒂夫·乔布斯索要员工0号怎么办?)


请注意,所有包跟踪网站都允许您跟踪包而无需验证。可以限制免密码订单状态页面上显示的信息量。

guid是实现这一点的方法

*编辑*

你可能想看看这个

我认为这个计划不是一个好主意。为什么不验证用户是否已登录并有权查看指定订单

如果您真的希望所有订单都在那里,而不需要任何身份验证,那么GUID将是最好的


或者,您可以尝试在订单号前面加上有关客户的信息。比如(PhoneNumber)(1…100)

为了满足要求,您可以简单地使用散列,例如索引或索引上的散列。这些将为您提供所需的足够安全性

要降低大小,您可以更改为不同的编码;例如64位


我还强烈建议坚持使用salt,否则散列值很容易被破坏。

出于安全原因,大多数块密码将使用大于32位大小的块

但是,我发现了一个专门为您所做的:

<>你可以考虑使用GUID,但也许你有理由避免这样做。(比如说,你的应用程序已经完成了。)

编辑:
实际上,如果GUID是允许的,那么它将为您提供128位的范围。您可以轻松地使用任何其他分组密码。拥有更大的空间(以长ID字符串为代价)的好处是,您将获得更多的保护,不受人们猜测ID的影响。(并不是说订单ID本身就应该是一个安全令牌…

如果您认为只知道订单号(或URL)就足以获取订单信息,那么:

  • 订单号空间必须非常大,否则攻击者和/或客户可能会搜索订单空间,以查看可以看到什么
  • 你应该考虑攻击者可以从许多机器上发动逐渐探测,并且可能是有耐心的。
  • 通过速率限制可以减少对订单号空间的探测,但这在web环境中很难应用——很难区分客户访问和攻击者访问
  • 还要考虑到订单号不是什么秘密,人们可能会通过电子邮件四处发送;一旦退出,就不可能收回
因此,为了方便无需登录即可单击检查我的订单,您已经创建了永久安全风险

即使你把订单号空间弄得很大,你仍然有一个问题,那就是那些URL在那里到处浮动,可能是那些不应该得到它们的人


如果需要登录会话来查看任何内容,然后只向他们显示他们有权查看的订单,那会好得多。这样,您就不必担心隐藏订单号或攻击者猜测订单号,因为单是订单号不足以获取任何信息。

我使用Blowfish(一种64位块的分组密码)原型化了这一想法。

关于您是否真的应该在一旁执行此操作的问题,这里有一个非常简单的固定密钥分组密码(因为您似乎只需要一个置换)

静态uint排列(uint id)
{
uint R=id&0xFFFF,L=(id>>16)^(((((R>>5)^(R3)^(R5)^(L3)^(L5)^(R3)^(R最近我开始使用一组小型库。其思想是将数字或数字列表加密为哈希字符串,如:

12345 => "NkK9"
[683, 94108, 123, 5] => "aBMswoO2UB3Sj"
这些库由不同的作者用流行的编程语言实现。它们还具有交叉兼容性,这意味着您可以用Python对数字进行编码,然后用JavaScript对其进行解码。它支持SALT、字母表定义,甚至可以排除坏词

Python:

hashids = Hashids(salt="this is my salt")
id = hashids.encode(683, 94108, 123, 5)
JS:


这不是政府认证的加密,但对于一些不可预测的永久链接共享网站来说已经足够了。

好吧,你可以用这种方式跟踪联邦快递和UPS包裹。我在想(SocialSecurityNumber)(1…100)可能会很好用。:-)@joe-lol SSN的哇!听起来像是《每日邮报》的一篇文章wtf@Michael-您缺少问题的一个要求,即使用线性索引。对于这样的名称,我很失望您没有提出基于线性反馈移位寄存器的建议。@LFSR-我没有看到任何线性索引要求。他说他想要自然后端的所有数字和“随机”在前端。一个密码块非常适合。散列不适合,因为它不是唯一的。@Michael-抱歉,我遗漏了一些东西。它是一个唯一的订单号,应用了散列?这怎么会不是唯一的?哦,我还应该注意,如果你只在URL中公开散列,那意味着你需要计算和存储散列,因为你不能修改如果URL长度不是一个问题,那么如果我需要避免自动递增,我会使用GUID,如果幕后的顺序ID很好,那么我会使用AES。与GUID不同,AES让我永远避免在唯一索引中存储冗长的标识符
hashids = Hashids(salt="this is my salt")
id = hashids.encode(683, 94108, 123, 5)
var hashids = new Hashids("this is my salt"),
numbers = hashids.decode("aBMswoO2UB3Sj");