我想给客户一个随机的订单号,但在后端使用0,1,2 ......这样,客户获得带有加密订单号的非密码保护订单状态URL,并且他们无法通过添加或减去1来查看其他客户的订单号。这可能会替换生成随机订单密钥的方案,检查唯一性在所有先前的订单中,并重新生成,直到唯一。当Web服务器收到查看订单的请求时,它会解密订单号并检索订单。
为了保持URL简短,什么“好”的加密算法具有最短的块大小?这个计划是个好主意吗? (如果我加密Apple,Inc。的员工ID以防止史蒂夫乔布斯要求员工#0,该怎么办?)
观察所有包裹跟踪网站允许您无需身份验证即可跟踪包裹。可以限制无密码订单状态页面上显示的信息量。
答案 0 :(得分:12)
出于安全原因,大多数分组密码将使用大于32位大小的块。
但是,我发现了一个专门用于你正在做的事情:Skip32
您可以考虑使用GUID,但也许您有理由想避免这种情况。 (说,您的应用已经完成。)
编辑: 实际上,如果GUID是允许的,那么这将为您提供128位的范围。您可以轻松使用任何其他分组密码。拥有更大空间(以长ID字符串为代价)的好处是,您可以获得更多来自人们猜测ID的保护。 (并不是说订单ID本身应该是安全令牌......)
答案 1 :(得分:4)
如果您的想法是只知道订单号(或网址)足以获得订单信息,那么:
因此,为方便一键式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)
答案 6 :(得分:0)
我不认为这个计划是一个伟大的想法。为什么不验证用户是否已登录并有权查看指定的订单?
如果您真的想要在没有任何身份验证的情况下获得所有订单,那么GUID最好。
或者,您可以尝试提供有关客户的前缀的订单号。喜欢(PhoneNumber)(1 ... 100)
答案 7 :(得分:0)