我正在构建一个小型Web应用程序,我要求人们的电子邮件地址,然后将它们存储在MySQL数据库中。要存储它们,我在PHP中使用password_hash
函数。 (此功能似乎主要用于密码,但我认为它可能适合安全存储电子邮件地址。如果由于某种原因不适合,请告诉我,也许建议我应该使用它。)< / p>
我遇到的麻烦是,当有人注册并存储他们的电子邮件地址时,我不确定是否有任何方法可以检查数据库中是否存在该电子邮件,因为我理解,后续使用password_hash
导致新的哈希值,无法检查?
另外,我想知道电子邮件列的数据库表中字段的最佳格式 - 文本? varchar 255?。
感谢。
答案 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);
}