这种用于URL缩短器的混淆算法是否有效?

时间:2011-06-09 03:09:12

标签: algorithm url obfuscation url-shortener base62

免责声明:我不是在问如何缩短网址(我已经实现了使用base-62编码字符串的“{3}}找到的”双向函数“答案。相反,我想扩展此实现以混淆生成的字符串,以便它们都是:

A)不是一个容易猜到的序列

B)仍然是双射的。

您可以轻松地随机化您的base-62字符集,但问题是它仍然像任何其他基础中的任何其他数字一样递增。例如,一个可能的增量进展可能是{aX9fgE, aX9fg3, aX9fgf, aX9fgR, … ,}

我提出了一种混淆技术,我很满意它的要求 A),但我只是部分确定它满足 B)。这个想法是这样的:

唯一保证在增量方法中改变的是“1位”(出于实用性原因,我将使用十进制术语)。在我之前给出的示例进展中,那将是{E, 3, f, R, …}。因此,如果base-62集合中的每个字符都有自己唯一的偏移数(例如,它与“零字符”的距离),那么您可以将“1的位置”字符的偏移量应用于字符串的其余部分。

例如,让我们假设一个带有字符{A, f, 9, p, Z, 3}的base-5集(从0到5的升序)。然后,每个将分别具有0到5的唯一偏移。计数看起来像{A, f, 9, p, Z, 3, fA, ff, f9, fp, …},依此类推。因此,当给定值fZ3p时,算法将查看p,并且偏移量为+3,将字符串置换为Zf9p(假设基数为5)是圆形阵列)。下一个增量编号为fZ3Z,而Z的偏移量为+4,算法返回39pZ。这些排列结果将作为他/她的“唯一网址”传递给用户,他们永远不会看到实际的 base-62编码字符串。

这种方法看起来似乎是可逆的;只看最后一个字符,并用负偏移量执行相同的排列。我认为,由于这个原因,它必须仍然是双射的。但我不知道这是必然是真的吗?有没有我不考虑的边缘/角落情况?

编辑:我的意图更倾向于缩短网址的长度,而不是模式的安全性。我意识到有很多解决方案涉及加密函数,分组密码等。但我想强调的是,我要求最好的方法来实现 A),但是相反,“是我的偏移方法,满足 B) ”。

您可以找到任何漏洞。

4 个答案:

答案 0 :(得分:2)

如果你真的希望它们难以猜测,请保持简单。

以在计数器模式下运行的普通加密算法开始。当你得到一个缩短的URL,增加你的计数器,加密它,使用可打印的字符(例如,base 64)将结果转换为某些东西,并将原始的URL和缩短的版本放入你的表中,这样你就可以从中获取原始的URL。需要时缩短版本。

那时唯一真正的问题是使用什么加密算法。反过来,这取决于您的威胁模型。通过缩短网址难以猜测,我看不到你获得了什么,所以我对威胁模型有点不确定。

如果你想让它有点难以猜测,你可以使用像40位版本的RC4。这很容易打破,但足以让大多数人免于打扰。

如果您想要更高的安全性,可以升级到DES。这已被打破,但即使在这个较晚的日期打破它相当一些工作。

如果您想要更高的安全性,可以使用AES。

请注意,在增加安全性时,缩短的URL会变长。 RC4-40以5字节,DES 7字节和32字节的AES开始。根据您转换为可打印文本的方式,这将至少扩展一点。

答案 1 :(得分:1)

另一个选择是使用Luby-Rackoff construction(另请参阅here),这是一种从伪随机函数生成伪随机排列的方法。

你只需要选择一个“圆函数”F.F必须将一个密钥K和一个比特块的一半作为输入。 F必须产生一个比特块作为输出,也是你编码的一半。

然后你只需要运行Luby-Rackoff构造(又名“Feistel网络”)四轮,每轮使用不同的K.

结构保证结果是双射映射,如果F难以反转,则很难反转。

答案 2 :(得分:1)

我试图解决同样的问题(在php中)并最终得到了这些功能:

所以对于A):它不容易猜到(对我来说)因为你不能增加一个字符串来获得没有算法的下一个记录

对于B):据我所知,它是100%双射的。

感谢@Nemo为feistel网络命名,这引导我进入我链接的第一个功能。

答案 3 :(得分:0)

如果您试图避免人们抓取网址,我认为Nick Johnson有正确的想法,您需要确保您的网址空间不密集。

这是一个简单的想法:获取您的URL,并在其前面添加一些随机字符。然后通过压缩算法运行它 - 我尝试范围编码(如果找到一个好的库,你可以指定基础)。这应该可以解压缩为原始形式,并且应该影响局部性并使编码空间更稀疏。

那就是说,我想几乎所有的URL缩短器都会在服务器端保留一个带状态的哈希表。你怎么能无损地将一百个字符的URL压缩成5个或6个字符呢?