除了主键(id)之外,我的整个数据库都是加密的。我需要使用$ email变量获取电子邮件。
$encrypted=registermodel::select('email')->where('email','=',$email)->get();
答案 0 :(得分:0)
您不能轻易地对其进行加密!您将必须获取每条记录并将其解密,然后比较纯文本
这是解决问题https://www.sitepoint.com/how-to-search-on-securely-encrypted-database-fields/
的正确方法以下是我尝试使用基于CRC的索引列
<?php
namespace App\ModelTraits;
use Illuminate\Support\Facades\Crypt;
/**
*
*/
trait EmailSigTrait
{
public function setEmailAttribute($value)
{
$this->attributes['email'] = Crypt::encryptString($value);
$this->attributes['emailsig'] = Self::crcemail($value);
}
public function getEmailAttribute()
{
if(!isset($this->attributes['email'])){
return;
}
$value = $this->attributes['email'];
if (empty($value)) {
return;
}
return strtolower(Crypt::decryptString($value));
}
static function crcemail($email)
{
$email = strtolower($email);
// anonymise the email
$name = str_before($email,'@');
$anon = substr($name, 0, 1) .
substr($name, strlen($name)/2,1) .
substr($name, -1) .
'@' . str_after($email, '@');
return sprintf(crc32(strToLower($anon)));
}
protected function findByEmailSig($email, $model)
{
$email = strtolower($email);
$candidates = $model::where('emailsig', $model::crcemail($email))->get();
foreach ($candidates as $candidate) {
if (strtolower($candidate->email) == $email) {
return $candidate;
}
}
return false;
}
}
将此特征包括在具有加密电子邮件地址的模型中。
为“ emailsig”添加文本列
保存电子邮件字段时,会为部分电子邮件地址创建一个crc值,并且电子邮件已加密。
检索电子邮件时将其解密
找到电子邮件时,它将计算CRC供用户查找,然后将其与为每个电子邮件地址存储的CRC值进行比较。由于可能存在多个匹配项(具有相同CRC值的一封以上电子邮件),因此会迭代可能的选择,直到找到正确的电子邮件为止。
根据您今天对电子邮件进行加密的方式,您可能需要适应各种情况。