0

我有一个 PHP 网站,它充当 Web 代理/匿名器,并且我设置了它,每个访问的页面都在我的服务器上缓存一段有限的时间。为了进一步确保安全,我想将 URL 编码为一组十六进制字符,但它需要足够独特,以防止两个 URL 发生冲突;缓存页面的文件名将反映编码的 URL,因此我不能允许它们被另一个页面的访问覆盖。

同时,我一直在使用这个:

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

...但是这里的问题是它总是随机的并且不能保证是完全唯一的。我想这样做,以便用户可以为他们的 URL 添加书签(并在给定的时间段内重新访问它们,而无需重新导航到页面)。如何生成这样的字符串?

4

1 回答 1

2

如果您需要“安全”,例如 URL 的不可逆、唯一“编码”,这就是哈希的用途:

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

每个 URL 的值都是唯一的,两个相同的 URL 将散列到相同的值,它们不可逆,并且对于大多数意图和目的来说都是随机值。

如果您正在谈论编码(从一种形式更改为另一种形式)或加密(使用密钥更改为另一种形式),那么您正在谈论可逆算法,在这种情况下,结果根据定义是唯一的。编码字符串不会是“安全的”,因为没有秘密。加密字符串与保守秘密一样安全。

所以你有三个选择:

  1. 编码(例如url_encodebase64_encode),这是不安全和可逆的
  2. 加密(例如 AES),它使用秘密并且是安全和可逆的
  3. 散列(例如 SHA1),这是不可逆的,因此是安全的

所有这三个都会产生唯一值(好的散列在数学上具有足够高的概率来产生唯一值)。

于 2012-12-12T10:10:26.097 回答