匿名的“邮箱验证”的可能性和不可能性
邮箱仅用于有效性验证,不记录在已生成账户中(也就是说,邮箱是一次性的)。
那么可以设计这样一个流程:
注册者提供邮箱;
服务器生成邮箱有效地址的hash;
如果表1包含邮箱hash,拒绝,流程结束;
服务器向邮箱发送一个x分钟内有效的,用于生成账户的,包含该邮箱hash的链接;
服务器在表2中以'链接hash':('邮箱hash','生成hash的epoch')的形式储存;
如果服务器收到该连接的访问并成功生成账户,则从表2中获取邮箱hash添加到表1,并从表1中删除该项;
并且建立任务:
删除表2中超过x分钟的项。
这个流程在实际操作上的问题是:
1,要维护两个表;
2,表1会无限制增长,查询速度越来越慢,最终拖垮服务器;
3,表2需要很频繁地遍历;
4,表1泄露导致短邮箱被暴破。
那么,匿名的“邮箱验证”是否可能?是否可行?
更新:
还要考虑到邮箱供应商的安全性,即是否会泄露“该用户在该网站有注册行为”。
这点可以通过对注册链接进行公钥加密的方法解决,现有的方案如 tweetnacl-js 和 js-nacl 。
注册者发送邮箱和公钥,服务器将链接用该公钥加密后发送至邮箱,注册者用私钥解密该链接。
那么可以设计这样一个流程:
注册者提供邮箱;
服务器生成邮箱有效地址的hash;
如果表1包含邮箱hash,拒绝,流程结束;
服务器向邮箱发送一个x分钟内有效的,用于生成账户的,包含该邮箱hash的链接;
服务器在表2中以'链接hash':('邮箱hash','生成hash的epoch')的形式储存;
如果服务器收到该连接的访问并成功生成账户,则从表2中获取邮箱hash添加到表1,并从表1中删除该项;
并且建立任务:
删除表2中超过x分钟的项。
这个流程在实际操作上的问题是:
1,要维护两个表;
2,表1会无限制增长,查询速度越来越慢,最终拖垮服务器;
3,表2需要很频繁地遍历;
4,表1泄露导致短邮箱被暴破。
那么,匿名的“邮箱验证”是否可能?是否可行?
更新:
还要考虑到邮箱供应商的安全性,即是否会泄露“该用户在该网站有注册行为”。
这点可以通过对注册链接进行公钥加密的方法解决,现有的方案如 tweetnacl-js 和 js-nacl 。
注册者发送邮箱和公钥,服务器将链接用该公钥加密后发送至邮箱,注册者用私钥解密该链接。
1. 拖垮服务器不是问题,因为用户数量增加也会拖垮服务器。查询用户名是否重复比这个工作量还大。
2. 也不是问题,因为加入计划任务直接删除时间戳低于某个时间的所有记录。
3. 短邮箱泄露几乎毫无损失,因为不和用户本身关联,只是泄露邮箱本身。自己写一个针对邮箱的hash function可有效避免短邮箱暴露。
结论:我认为可行,一定程度上加大注册难度,且保证匿名性。唯一需要注意的是邮件发送的服务器,需要一个第三方可靠的服务器,否则会暴露品葱网站服务器IP或泄露注册邮箱本身。
2. 也不是问题,因为加入计划任务直接删除时间戳低于某个时间的所有记录。
3. 短邮箱泄露几乎毫无损失,因为不和用户本身关联,只是泄露邮箱本身。自己写一个针对邮箱的hash function可有效避免短邮箱暴露。
结论:我认为可行,一定程度上加大注册难度,且保证匿名性。唯一需要注意的是邮件发送的服务器,需要一个第三方可靠的服务器,否则会暴露品葱网站服务器IP或泄露注册邮箱本身。
现在有很多tempmail一类的服务,所以我觉得靠验证有效邮箱来提升用户注册成本难以收到显著成效