我得到十六进制数字以生成唯一的随机激活器链接,例如:
hostname/account/confirm/$randomHex
通过搜索,实际上,我使用PHP的随机十六进制可能是:
bin2hex( openssl_random_pseudo_bytes(16) )
上面生成一个32位十六进制数字的字符串,我希望使用较小的长度作为12个十六进制数字。
考虑到计算机的电源处理,我能够使用的十六进制最小安全性是什么?
答案 0 :(得分:2)
考虑到计算机的电源处理,我能够使用的十六进制最小安全性是什么?
如果你有一个威胁模型,这实际上是一个很容易计算的数字。
根据您提供的网址,您似乎正在生成电子邮件所有权验证的网址。这比密码重置URL明显需要。
如果您对不良尝试进行评级(即阻止其IP地址再次尝试24小时),您可以使用8个十六进制字符(32位),纯粹的机会意味着他们将能够猜出有效65,536次尝试后的确认链接,概率为50%。 (The Birthday paradox。)关闭此功能还需要65,536个IP地址才能盲目确认某人的电子邮件地址(可能不是他们自己的)。
<强>无论其!强>
如上所述,如果您使用此功能,例如恢复功能(我忘记了密码),不要缩短字符串长度。应将128位(32个十六进制,16个原始二进制)视为下限。为了安全,我会说256位的拍摄。
上面生成一个32位十六进制数字的字符串,我希望使用较小的长度作为12个十六进制数字。
如果要增加给定固定长度的字符串的安全性,唯一的方法是增加字符串中每个字符的可能值的数量。
即使你使用的是原始二进制文件,你也不会使用原始二进制文件,11个字符的上限是88位的熵。指定十六进制会将你减少到44(但很可能是40,因为你可能在这里写bin2hex(random_bytes(5))
)。
如果您想安全地生成具有任意字母的固定大小的字符串,请查看this StackOverflow answer。
答案 1 :(得分:0)
16个随机生成的字节给出128位熵。具有128位熵的密钥是uncrackable using an offline brute force attack。即使世界上每台计算机都在努力破解它。
但是,您希望防止在线暴力攻击,这种攻击要慢得多。如果你想要12个十六进制字符,那么这将是6个字节,因此是48位熵。这为您提供了281,474,976,710,656种可能性。如果您的网站需要0.25秒 * 秒来响应,那么通过向您的网站发出请求(111.6万年),平均需要2^47 * 0.25 = 35,184,372,088,832
秒来蛮力。
你用48位安全。
*实际上这将是一次并行攻击,因此如果他们所做的只是验证一个帐户,攻击者就不必等待响应。但是,任何系统都会有速率限制,从而减缓攻击速度。根据需要调整数字以适合您的系统。