2012-12-12 36 views
0

我有一个PHP网站,它充当一个网络代理/匿名者,并且我已经设置每个访问页面在我的服务器上缓存的时间有限。为了进一步确保安全,我想将网址编码为一组十六进制字符,即,但它需要足够独特,以至于没有2个URL会一起冲突;缓存页面的文件名将反映编码的URL,因此我不能让它们被另一页的访问覆盖。在PHP中安全,唯一,编码的URL /文件名?

同时,我一直在使用这样的:

$file = str_shuffle(preg_replace("/[^a-zA-Z0-9\s]/", "", urlencode($url))) .".html"; 

...但这里的问题是,它总是随机的,但不保证完全独一无二。我想这样做是为了让用户可以为其网址添加书签(并在给定的时间段内重新访问它们,而无需重新导航到页面)。我怎样才能生成这样的字符串?

+0

即使您只是单独使用'urlencode',2个不同的网址也不会发生冲突,您为什么会认为它们会发生冲突? – Esailija

+0

UUID? '/ dev/urandom' +'base64_encode'? – Charles

+0

如果用户正在访问动态页面,例如约会网站,邮件显示在post.php上,而不是为每个用户分开? – The87Boy

回答

2

如果你需要一个“安全”的,如不可逆,独特的URL的“编码”,这就是hashes是:

$hash = sha1('http://...'); 

值将是唯一的每个网址,二相同的URL会哈希到相同的值,它们不可逆并且对于大多数意图和目的是随机值。

如果你在谈论编码(从一种形式到另一种变化)加密(改变成另一种形式使用密钥),那么你在谈论可逆算法,在这种情况下,结果是独一无二的定义。 编码字符串将不会“安全”,因为没有秘密。 加密该字符串与您保守秘密一样安全。

所以,你有三种选择:

  1. 编码(如url_encodebase64_encode),这是不安全的,可逆的
  2. 加密(例如AES),它使用一个秘密,是安全的,可逆的
  3. hashing(例如SHA1),这是不可逆的,因此是安全的

所有这三个结果在独特的价值观(好哈希有一个数学上的高足够的可能性导致唯一值)。

+0

真棒,谢谢! 'md5('http:// ...')'具有相同的“不可逆转”效应吗?哪个更安全? – RectangleEquals

+0

是的,MD5是如上所述的散列。到现在为止有点老,并且产生非唯一值的概率更高,并且/或者具有使其能够反转到原始值的其他概率。这可能足够满足您的预期目的,但现在更推荐使用SHA1或SHA256(甚至512)。哈希值虽然较长,但取决于您的优先级。 – deceze

+0

既然我的网站不是政府中央情报局的行动,我想我可以解决MD5,哈哈。如果我发现需要这样做,将来移植代码以使用sha1应该不会太难。谢谢! – RectangleEquals