从字符串生成 6 位数字(用于电子邮件验证)

Posted

技术标签:

【中文标题】从字符串生成 6 位数字(用于电子邮件验证)【英文标题】:Generate 6 digits from string (for email verification) 【发布时间】:2021-10-23 00:46:20 【问题描述】:

如果用户尝试更改他/她的电子邮件,我想生成一个 6 位数的代码以发送到他的电子邮件,以便他可以将其输入到表单中,以便我可以验证他拥有该电子邮件。 因为我不想将这 6 位数字保存在任何地方,我希望能够通过使用 2 个字符串来创建这 6 位数字:1)用户的电子邮件(例如 test123@gmail.com)2)密码(例如 d%kDh ^l1285)。 php whitch 中是否有一个函数将一个字符串(我可以将它们连接起来)或多个字符串作为参数来产生 N 个数字?

PS:我已经限制了用户可以提出的请求数量。

【问题讨论】:

看看这里***.com/questions/5464906/…和这里***.com/questions/41972111/… 将代码存储到用户表的问题在哪里?你可以创建一个哈希。提取它的前六位数字(使用正则表达式很容易)并与它们进行比较。 为什么不想使用 OTP(一次性密码)? 我知道将密码保存到用户表并不是什么大问题,但我的指令是不要在任何地方存储任何东西 【参考方案1】:

您的方法的问题是重放攻击。假设您可以从电子邮件地址和密码生成代码。用于此的加密工具是消息验证码,您也可以在 php 中使用hmac,尽管它不会是 6 位。

但是这样的代码不会是一次性令牌,它甚至不会有时间限制,它会永远有效,对于所有未来与同一电子邮件地址的通信,这不适合此应用程序。为此使用 hmac 的正确方法是将随机数(随机值)或时间戳与电子邮件地址一起包含,但这也必须存储 - 这样,您可以简单地将完全随机值存储为好吧。

您实际上可以做的一件事是将 hmac 应用于电子邮件地址和电子邮件添加到您的站点的日期时间(我猜您已经存储了它),并且仅在日期时间不太旧的情况下接受代码。这仍然不是一次性代币,但至少会受到时间限制,从而减轻一些风险。

hmac 也不是 6 个字符,但特别是如果它不是一次性令牌,6 个字符无论如何是不够的,和/或您应该有其他保护措施来防止暴力破解 - 这又将是有状态的某种方式,即。必须存储一些东西。

简而言之,虽然您可以获得一些相关问题的部分解决方案,并且您可能能够在不存储任何额外内容的完全无状态解决方案中减轻许多风险,但可能会很多只存储一个随机代码更简单、更安全。简单确实有利于安全。

【讨论】:

我已经将用户可以发出的请求数限制为每分钟 6 个。 如果您接收电子邮件,将其与创建的时间戳连接起来,使用您的秘密创建一个 hmac,并获取它的前六个字符,这实际上可能对您的目的来说足够安全。 您还希望用户输入他们的密码以及 6 位代码。但是,你很想存储那个 6 位数的代码。否则,找一个关心安全的新雇主。 ;)

以上是关于从字符串生成 6 位数字(用于电子邮件验证)的主要内容,如果未能解决你的问题,请参考以下文章

安卓中用于电子邮件、用户名和手机号码的正则表达式

从 android studio 在 bitnami Parse 服务器上设置电子邮件验证

qq邮箱可以用来注册英语b级账号吗

即时银行帐号验证

正则表达式从字符串中查找电子邮件地址

南邮数据结构考试时间