gpt4 book ai didi

php - 我可以存储散列的电话号码并将其未散列发送到电子邮件吗?

转载 作者:行者123 更新时间:2023-11-29 05:10:06 25 4
gpt4 key购买 nike

我的新 PHP 工作有一个任务,但我不知道是否可以解决。任务:

You need to create PHP web page that implements functional on picture below. Data must be stored in SQL. Hacker can not see user phone numbers and emails even if he got access to database or files. The solutions must contain standard PHP libs.

那么,我应该用什么算法来解决问题呢?我可以使用 password_hash() 函数存储电子邮件,当我需要从电子邮件中检索电话号码时,我将使用 password_verify() 来查明电子邮件是否存在。但是,如果我需要发送纯净且未经哈希处理的电话号码,该如何处理?

enter image description here

最佳答案

PHP 提供内置 solutions用于加密和解密数据。使用例如MCrypt , 支持大量常用算法。究竟是什么cipher您的选择取决于您,具体取决于所需的安全级别。阅读Wikipedia on block ciphers对于一般情况。 编辑:刚得知MCrypt是deprecated在 PHP 7.1 中使用 OpenSSL建议取而代之。

如果即使黑客获得了对您系统的完全访问权限也必须无法访问电话号码,那么解密 key 显然必须在服务器外,即。你不能将它存储在数据库或文件系统中。

在您的规范中,此 key 将是与电话号码匹配的电子邮件地址。然后,在输入时,您将单向散列电子邮件,并使用未散列的电子邮件作为加密电话号码的 key 。在请求时,您将使用电子邮件哈希找到匹配的电话号码,并使用未哈希的电子邮件作为 key 对其进行解密。应该让你排序。


更新:在获取与数据库中的电话/电子邮件对匹配的记录时,如果您使用了password_hash()(它会生成一个新的盐和一个每次都是唯一的字符串),那么你唯一的选择就是获取所有记录并通过 password_verify() 迭代它们。这不是特别可扩展。

除非这是一个安全练习,否则我不确定我是否会为电子邮件使用一个简单的 sha1() 散列。或者使用例如crypt($email, '$2y$08$Some22CharsOfFixedSalt$'); -- 参见 crypt() -- 并生成使用固定盐字符串的基于河豚的哈希,从而产生不变的哈希。然后我还会从数据库条目中截断结果字符串的前导盐部分。

如果您感觉很狡猾,为什么不设计一种算法从每封电子邮件中派生出一个唯一的字符串,然后在您的散列函数中使用该算法作为加盐,而不是使用相同的加盐来散列所有电子邮件。

您还可以委托(delegate)数据库的电子邮件散列并使用 MySQL's encryption functions .然后你会使用例如SHA2('email', 256) 在您的 INSERTSELECT 查询中,如下所示:INSERT INTO records VALUES (SHA2(' email@what', 256), 'TheEncryptedTelNo');SELECT * FROM records WHERE email = SHA2('email@what', 256);。 (一定要注意手册关于明文数据可能存储在日志中的警告;即在执行此操作之前了解您的 MySQL 设置。)

关于php - 我可以存储散列的电话号码并将其未散列发送到电子邮件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40847398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com