在多服务器php应用程序上生成令牌时,令牌冲突/重复的可能性有多大?

u0sqgete  于 2023-10-15  发布在  PHP
关注(0)|答案(1)|浏览(118)

我有一个包含用户可以访问的URL的表:

id PK AUTOINCREMENT
token VARCHAR (8)
user_id_visited INTEGER
visited BOOLEAN

URL的格式为https://example.com/mypage/^token^,其中^token^是从上面的^token^字段中检索的。我想实现的是阻止一个拥有user_id_visited的用户重新访问一个拥有相同令牌的页面。
我这样生成令牌:

$token = bin2hex(random_bytes(5));

// Insert token in the database here

但我的应用程序是在2个web服务器示例中编写在同一个数据库中。我想避免生成相同的令牌,因此一个想法是使用服务器的主机名:

$token = gethostname()."_".bin2hex(random_bytes(5));

所以我的问题是,如果我避免使用gethostname,那么只使用random_bytes生成重复令牌的机会有多大?

qnyhuwrf

qnyhuwrf1#

基于这个thread,可能使用random_bytes(5),您可以有接近2^40个可能的唯一令牌,这意味着在生成2^20 = 1048576个令牌后,冲突的可能性为39%。
因此,根据数据库中的条目数量,重复的可能性相当大。
也许最好的解决方案是修改你的数据库,让它接受UUID,然后生成UUID,这样在2^122个可能的唯一ID中有更好的唯一性。

相关问题