如何检查使用password_hash存储的电子邮件在数据库中尚不存在

时间:2016-06-30 14:53:56

标签: php mysql hash

我正在构建一个小型Web应用程序,我要求人们的电子邮件地址,然后将它们存储在MySQL数据库中。要存储它们,我在PHP中使用password_hash函数。 (此功能似乎主要用于密码,但我认为它可能适合安全存储电子邮件地址。如果由于某种原因不适合,请告诉我,也许建议我应该使用它。)< / p>

我遇到的麻烦是,当有人注册并存储他们的电子邮件地址时,我不确定是否有任何方法可以检查数据库中是否存在该电子邮件,因为我理解,后续使用password_hash导致新的哈希值,无法检查?

另外,我想知道电子​​邮件列的数据库表中字段的最佳格式 - 文本? varchar 255?。

感谢。

1 个答案:

答案 0 :(得分:0)

您有几个问题:

在电子邮件中存储电子邮件的最佳方式是什么?

电子邮件标准限制电子邮件地址不超过255个字符,因此VARCHAR(255)是正确的选择,除非您碰巧知道您的用户总是更小。例如,如果您在大学并且知道没有用户名超过8个字符,并且全部格式为xxxxxxxx@yyyyyyyy.zzzzz.edu。除非您正在做类似的事情,否则请坚持使用VARCHAR(255)。

我们如何安全地存储电子邮件地址?

密码哈希是一种单向函数。获得散列值后,您可以确认值与其匹配,但不能从散列值返回到原始值。如果您只关心检查以前是否输入了电子邮件地址,那么您可以使用密码功能或其他哈希函数。

如果您需要使用电子邮件地址,则无法从散列值中获取原始内容。如果你想这样做,你需要使用某种可逆加密。

如果你看看这里: http://php.net/manual/en/function.mcrypt-encrypt.php

您可以找到可逆加密的一个很好的例子。您基本上会执行以下操作:

function store_email($user_id, $key){
    $email = get_email($_POST);
    if !(validate_email($email)){
        report_error();
    } else {
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $encrypted_email = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $email, MCRYPT_MODE_CBC, $iv);
        store_email($user_id, $encrypted_email);
    }
}

function decode_email($email_field, $key){
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = substr($email_field, 0, $iv_size);
    $email_enc = substr($email_field, $iv);
    return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $email_enc, MCRYPT_MODE_CBC, $iv);
}