我有一个包含用户可以访问的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
生成重复令牌的机会有多大?
1条答案
按热度按时间qnyhuwrf1#
基于这个thread,可能使用
random_bytes(5)
,您可以有接近2^40个可能的唯一令牌,这意味着在生成2^20 = 1048576个令牌后,冲突的可能性为39%。因此,根据数据库中的条目数量,重复的可能性相当大。
也许最好的解决方案是修改你的数据库,让它接受UUID,然后生成UUID,这样在2^122个可能的唯一ID中有更好的唯一性。