使用 GUID 作为用户的唯一标识符而不是电子邮件地址对低功率攻击者有好处。带有 GUID 的 URL 已通过电子邮件发送,因此不能将其视为真正机密。有动机的攻击者将监视网络线路并查看该电子邮件。然而,业余爱好者或自动攻击机器人虽然无法阅读其他人的电子邮件,但可能会“猜测”电子邮件地址,但不能“猜测”随机 GUID。
因此,GUID 只有在不可预测的情况下才与安全性有任何关系,然后它只会对不太强大的攻击者带来任何好处。使用 GUID 并没有什么坏处,但不要相信它真的增加了很多保护。您可能希望确保 GUID 是使用第 4 版算法生成的,即来自强 PRNG 的 122 位:虽然 GUID 的目标是唯一性,但您需要不可预测性,这是另一种野兽;版本 4 GUID 确保两者。
请记住,GUID 不是(真的)秘密,您的系统可以这样描述:有一个一次性注册密码,它是一个四位数的 PIN。注册后,使用普通用户选择的密码。
主要问题是四位数的 PIN 太容易猜到:攻击者平均只需要尝试 5000 次才能找到正确的密码。您可以通过在对给定 GUID 进行 3 次错误尝试后停用 PIN 码来缓解此问题;那是智能卡的模型,以您的服务器为卡。但是,这只会阻止进行在线暴力破解的攻击者。
不幸的是,某些攻击者偶尔会瞥见服务器数据库的某些部分。例如,这是 SQL 注入攻击的常见结果。废弃的旧硬盘也是此类泄漏的典型来源。这就是为什么您设想不存储 PIN 码的密码,而只存储其散列版本的原因。
但是密码散列,即使做得正确,也只会减慢攻击者的速度。如果迭代计数设置得如此之高,以至于您的服务器需要整整十秒的时间来验证 PIN 码(而十秒对于等待的客户来说是非常长的时间),那么攻击者将“只”需要 50000 秒使用相同的硬件进行计算,以“尝试” 5000 个可能的 PIN 码。由于攻击者将投入几台多核 PC,他可能会在一两个小时内倒下。这不是很多。
我建议使用更长的 PIN 码,比如 8 位数字。
总而言之:即使是一次性注册页面,您的 GUID 也不够“保密”,无法容忍四位数的 PIN。使用 GUID 代替电子邮件地址很有趣,并且您希望它尽可能谨慎(因此使用“v4”GUID),但即便如此,当验证系统不是篡改时,四位数字对于 PIN 是不够的 -耐智能卡。使用八位数(或更多)。由于用户只会输入一次 PIN 码,他可以容忍一个相当长的序列(微软可以让用户输入 25 个字母的激活密钥,所以我认为注册的 8 位数字要求不会太高)。