哪种“好”块加密算法的输出最短?

时间:2009-02-04 20:07:21

标签: encryption

我想给客户一个随机的订单号,但在后端使用0,1,2 ......这样,客户获得带有加密订单号的非密码保护订单状态URL,并且他们无法通过添加或减去1来查看其他客户的订单号。这可能会替换生成随机订单密钥的方案,检查唯一性在所有先前的订单中,并重新生成,直到唯一。当Web服务器收到查看订单的请求时,它会解密订单号并检索订单。

为了保持URL简短,什么“好”的加密算法具有最短的块大小?这个计划是个好主意吗? (如果我加密Apple,Inc。的员工ID以防止史蒂夫乔布斯要求员工#0,该怎么办?)

观察所有包裹跟踪网站允许您无需身份验证即可跟踪包裹。可以限制无密码订单状态页面上显示的信息量。

8 个答案:

答案 0 :(得分:12)

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

但是,我发现了一个专门用于你正在做的事情:Skip32

您可以考虑使用GUID,但也许您有理由想避免这种情况。 (说,您的应用已经完成。)

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

答案 1 :(得分:4)

如果您的想法是只知道订单号(或网址)足以获得订单信息,那么:

  • 订单号空间需要非常大,否则攻击者和/或客户可以想象搜索订单空间,看看能看到什么。
  • 您应该考虑攻击者可以从众多计算机上逐步进行探测,并且可能会有耐心。
  • 通过速率限制可以缓解订单号空间的限制,但这很难应用于Web环境 - 很难区分您的客户访问权限和攻击者访问权限。
  • 还要考虑订单号不是什么秘密,人们可能会在电子邮件中发送;一旦它出来,就不可能收回。

因此,为方便一键式check-my-order-without-logging-in,您已经造成了永久的安全风险。

即使您使订单号空间巨大,您仍然会遇到这些网址在那里漂浮的问题,可能是拥有不应该获得它们的人。

要求登录会话以查看任何内容会更好,然后只向他们显示他们有权查看的订单。然后你不必担心隐藏订单号或攻击者猜测订单号,因为只是订单号不足以访问任何东西。

答案 2 :(得分:2)

最近我开始使用Hashids个小型库。我们的想法是将数字或数字列表加密为哈希字符串,如:

12345 => "NkK9"
[683, 94108, 123, 5] => "aBMswoO2UB3Sj"

各种作者用流行的编程语言实现库。它们也是交叉兼容的,这意味着您可以在Python中对数字进行编码,然后将其解码为JavaScript。它支持盐,字母表定义甚至排除坏词。

的Python:

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

JS:

var hashids = new Hashids("this is my salt"),
numbers = hashids.decode("aBMswoO2UB3Sj");

这不是政府证明加密,但对于一些不可预测的固定链接共享站点来说已经足够了。

答案 3 :(得分:1)

我使用Blowfish构建了这个想法,Blowfish是一个64位块的分组密码。

答案 4 :(得分:1)

你是否真的应该这样做的问题,这是一个非常简单的带有固定密钥的分组密码(因为你似乎只需要一个排列)。

static uint permute(uint id)
{
  uint R = id & 0xFFFF, L = (id>>16) ^ (((((R>>5)^(R<<2)) + ((R>>3)^(R<<4))) ^ ((R^0x79b9) + R)) & 0xFFFF);
  R ^= ((((L>>5)^(L<<2)) + ((L>>3)^(L<<4))) ^ ((L^0xf372) + L)) & 0xFFFF;
  return ((L ^ ((((R>>5)^(R<<2)) + ((R>>3)^(R<<4))) ^ ((R^0x6d2b) + R))) << 16) | R;
}

就32位分组密码而言,Skip32要好得多,但当三条(长)线路可以做的时候,它有点重量级。 : - )

答案 5 :(得分:0)

guid是实现这一目标的方法

*编辑*

你可能想看看这个 http://csharpfeeds.com/post/4382/A_shorter_and_URL_friendly_GUID.aspx

答案 6 :(得分:0)

我不认为这个计划是一个伟大的想法。为什么不验证用户是否已登录并有权查看指定的订单?

如果您真的想要在没有任何身份验证的情况下获得所有订单,那么GUID最好。

或者,您可以尝试提供有关客户的前缀的订单号。喜欢(PhoneNumber)(1 ... 100)

答案 7 :(得分:0)

要满足要求,您只需在索引上使用SHA-1MD5等哈希值即可。这些将提供您所需的足够安全性。

要降低尺寸,您可以更改为不同的编码;比如64位。

我还非常强烈建议 坚持使用salt,否则哈希值很容易被破坏。