Algorithm 这种用于URL缩短器的模糊算法有效吗?

Algorithm 这种用于URL缩短器的模糊算法有效吗?,algorithm,url,obfuscation,url-shortener,base62,Algorithm,Url,Obfuscation,Url Shortener,Base62,免责声明:我不是在问如何缩短URL(我已经实现了使用base-62编码字符串的“双射函数”答案)。相反,我希望扩展此实现以混淆生成的字符串,使其同时满足以下两个条件: A)不是一个容易猜测的序列,以及 B)仍然是双射的。 您可以轻松地随机化base-62字符集,但问题是它仍然像任何其他基中的任何其他数字一样递增。例如,一个可能的递增过程可能是{aX9fgE、aX9fg3、aX9fgf、aX9fgR、…} 我提出了一种模糊处理技术,我对需求A)感到满意,但我只能部分确定它满足B)。这个想法是: 在

免责声明:我不是在问如何缩短URL(我已经实现了使用base-62编码字符串的“双射函数”答案)。相反,我希望扩展此实现以混淆生成的字符串,使其同时满足以下两个条件:

A)不是一个容易猜测的序列,以及

B)仍然是双射的。

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

我提出了一种模糊处理技术,我对需求A)感到满意,但我只能部分确定它满足B)。这个想法是:

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

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

这种方法显然是可逆的;只需查看最后一个字符,并使用负偏移量执行相同的排列。我在想,出于这个原因,它必须仍然是双射的。但我不知道这是否一定是真的?是否有我未考虑的边缘/角落案例

编辑:我的意图更倾向于缩短URL的长度,而不是模式的安全性。我知道有很多解决方案涉及加密函数、分组密码等。但我想强调的是,我不是在问实现A)的最佳方法,而是“我的偏移方法满足B)


任何你能找到的洞都会很感激的。

如果你真的想让它们难以猜测,请保持简单

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

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

如果你想让它稍微难以猜测,你可以使用类似40位版本的RC4。这很容易打破,但足以让大多数人免于烦恼

如果你想要多一点安全性,你可以升级到DES。这已经被打破了,但即使在这么晚的时候打破它也是一项相当艰巨的工作

如果你想要更多的安全性,你可以使用AES


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

另一个选项是使用(另请参见),这是一种从伪随机函数生成伪随机置换的方法

你只需要选择一个“圆函数”F。F必须将一个键K和一个位块作为输入,其大小为你正在编码的一半。F必须产生一个位块作为输出,该位块的大小也是您正在编码的内容的一半

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


这种结构保证了结果是一个双射映射,如果F很难反转,则很难反转。

如果你试图避免人们在URL上爬行,我认为Nick Johnson的想法是正确的,你需要确保你的URL空间不密集

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


也就是说,我想几乎所有的URL缩短器都会在服务器端保留一个带有状态的哈希表。您还打算如何将100个字符的URL无损压缩为5或6个字符?

我尝试解决相同的问题(在php中),并最终得到了以下函数:

所以对于A):这是不容易猜到的(对我来说),因为你不能增加一个字符串来获得下一个记录,而不使用algo

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


感谢@Nemo为feistel网络命名,这让我找到了我链接到的第一个功能。

通过混淆实现的安全性不是securi