在 laravel 中加密或散列电话号码
Posted
技术标签:
【中文标题】在 laravel 中加密或散列电话号码【英文标题】:encrypting or hashing phone number in laravel 【发布时间】:2022-01-21 05:53:42 【问题描述】:我们开发了一个移动应用程序,它使用手机号码和 otp 进行身份验证。由于电话号码是敏感用户信息的一部分,我们必须对其进行加密或哈希处理,以降低泄露用户敏感数据的风险。
当用户登录时,在 otp 之后,我必须从 db 中获取用户信息,为此,我必须运行查询以匹配数据库中的用户电话。加密工作正常,因为我可以解密手机,然后匹配登录电话号码。但是,由于用户数量众多,速度较慢
我的另一个选择是对电话号码进行哈希处理。然后我可以将登录电话号码与数据库中的散列电话进行散列。但是,由于相同的电话号码不会生成相同的哈希,因此无法进行比较
另一种方法是使用哈希检查功能,但当您针对从数据库获取的单行登录电话的单个值时,可以单独使用该功能。
我想知道是否可以在 laravel 查询中使用散列匹配,以便将散列的登录用户电话号码与数据库中的散列电话号码进行检查。
如果有人可以为此提供解决方案,我将不胜感激。
问候
【问题讨论】:
“但是,由于相同的电话号码不会生成相同的哈希,因此无法进行比较”为什么不呢?哈希是可重现的,例如,尝试在终端中运行命令:php -r "echo hash('sha256', '867-5309');"
,您会发现无论运行多少次,输出都是相同的。
再补充一点,如果您不能通过从相同的未散列数据开始多次复制散列,那么散列首先会有什么可能的价值?如果是这种情况,任何程序将如何完成密码验证?这类似于只是删除原始数据并用随机字符替换它。
在 laravel 中,hash::make 函数每次使用不同的 salt 来为同一个字符串生成不同的 hash。您可以使用另一个函数 Hash::check('plain-text', $hashedtext) 如果两个哈希都来自相同的文本,它将返回 true。但是,此函数不能在查询中使用。您必须先获取所需的行,然后运行上述函数
好的,那为什么不使用一种不同的散列函数,就像我上面提到的那样?
【参考方案1】:
很抱歉写下这个作为答案,但我在 cmets 部分建议这个的声誉很低。
当用户通过注册提交他们的电话号码时,提取号码的前3位数字
如果我们使用上面的图片作为参考,那将是 555。
第一步
从您的用户电话号码数据库中为这 3 位数字创建一个新列,用作查找表。 您已经提到您已经对电话号码进行了哈希处理,为此将需要查询所有电话号码,将它们一一解密并将这 3 位数字添加到新列中。
第 2 步
当您要检查用户电话号码时,请检查您的电话号码数据库并检索与该查找号码示例 555 匹配的所有结果(如果您希望返回大量结果,请确保使用Eloquent cursor。
您的查询将类似于:
PhoneBook::where('part_number','=',555)->get();
话虽如此,您可以再次检查哈希是否与Hash::check
匹配,但检查范围将受到限制,速度将显着提高
【讨论】:
以上是关于在 laravel 中加密或散列电话号码的主要内容,如果未能解决你的问题,请参考以下文章
Javascript:有选择地从 URL 中删除散列(或散列),以使 URL 保持有效或可用