php - php中没有电子邮件的冲突哈希
问题描述
以前有人问过这个问题,但是很多线程都很老了。
我需要对电子邮件地址进行哈希处理以存储在我的数据库中。稍后我需要匹配一个哈希,因此每个唯一电子邮件的哈希每次都需要相同。是否存在相同哈希的风险?与说 md5() 或 hash() 冲突?这些天推荐的方式是什么(2021)
提前致谢
解决方案
这很简单。password_hash() 是 md5() 的替代品。但是你在这里谈论的是散列电子邮件。电子邮件与密码不同。
作为管理员,您无需知道用户密码即可授予用户访问权限。但是,如果您想发送时事通讯、注册确认,甚至通过电子邮件提供一个选项来找回丢失的用户帐户访问权限,您将需要知道用户电子邮件。上述哈希选项都不会帮助您。因为上述选项会破坏原始数据并给您留下碎片。
在任何情况下,password_hash() 是 60 个字符,而 md5() 是 32 个字符。因此 password_hash() 是最安全的选项,而 md5() 早已过时,不应使用。冲突不是您应该担心密码的事情。因为用户可以拥有相同的密码甚至相同的哈希数据。但是由于数据属于不同的账户,没有正确的用户名,哈希对于用户登录是没有用的。
所以现在一切都归结为电子邮件。您可以使用这种简单的加密和解密来实现。在这种情况下,因为数据不会被破坏并被保留。这意味着没有发生冲突的可能性,尤其是考虑到每个用户应该有不同的电子邮件。但即使数据完全相同,每次的哈希结果还是会有所不同。所以这个选项不会出错。
function enc($data, $key, $mode=0){
$cipher = "aes-256-gcm";
if(in_array($cipher, openssl_get_cipher_methods())){
if(!$mode){ // encrypt
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$data = openssl_encrypt($data, $cipher, $key, $options=0, $iv, $tag);
$data = base64_encode($data.'::'.$iv.'::'.$tag);
}else{ // decrypt
list($data, $iv, $tag) = explode('::', base64_decode($data), 3);
$data = openssl_decrypt($data, $cipher, $key, $options=0, $iv, $tag);
}
}
return $data;
}
- 加密数据:enc('DATA','KEY'); (其中KEY可以是用户密码)=> RETURNS: ENC_KEY
- 解密数据:enc('ENC_KEY','KEY',1); (其中KEY可以是用户密码)=> RETURNS: DATA
推荐阅读
- c# - IIS 某些应用程序无法访问并继续加载
- asp.net - 如何:从 MVC .NET 网站重定向到 MVC .NET Core 子站点,而无需用户“重新登录”
- javascript - 从javascript / typescript中的另一个函数访问函数的参数
- r - 异常化函数的问题
- java - URLEncoder - 用于空白空间而不是 %20 或 + 的字符集
- php - 使用 GD 调整 PHP 图像大小到许多 CPU 时间
- postgresql - 直接从 json 更新表
- angular - 从另一个组件Angular 7中获取价值
- php - 如何在 html 标签中正确包装 php 变量?
- typescript - 在 typescript 类型中引用静态方法:自动拾取方法签名