首页 > 解决方案 > php中没有电子邮件的冲突哈希

问题描述

以前有人问过这个问题,但是很多线程都很老了。

我需要对电子邮件地址进行哈希处理以存储在我的数据库中。稍后我需要匹配一个哈希,因此每个唯一电子邮件的哈希每次都需要相同。是否存在相同哈希的风险?与说 md5() 或 hash() 冲突?这些天推荐的方式是什么(2021)

提前致谢

标签: phphash

解决方案


这很简单。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

推荐阅读