如何搜索由 libSodium 加密的数据库列?

How to search database columns encrypted by libSodium?

我正在使用 SODIUM 来加密存储在数据库中的个人数据。我可以愉快地加密和解密存储的数据。我在存储到数据库时加密名字和姓氏、电话号码、电子邮件地址等。

但是我不知道如何搜索加密数据。任何人都可以提供加密数据然后能够搜索它的指针吗?

例如,我需要按名字、姓氏等进行搜索,但这是加密的。

我正在使用此代码进行搜索并考虑 'stupidly' 加密名称,但当然会重新加密它,然后它与实际记录不同。

public function searchStaff($string) {
  $this->db->query('SELECT * FROM staff WHERE lastName IN (:unEncrypted, :encrypted)');
  $this->db->bind(':unEncrypted', $string);
  $this->db->bind(':encrypted', $string);
  $results = $this->db->resultSet();
  return $results;
}

我什至不确定该怎么做,到目前为止我唯一的想法是解密每一行,检查,然后 return 但这是一种明显有缺陷的看待方式,尤其是当 table 变大时!

我正在使用下面的代码在列中创建加密条目。我目前唯一的想法是将 $nonce 存储在数据库行中并使用它依次解密每一行?但这会产生巨大的开销吗??

人们如何确保个人数据的安全?

//create random number
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);

//encrypt the input
//to encrypt the value we pass it to sodium_crypto_secretbox() with our key
//and a $nonce. The nonce is generated using random_bytes(), because the 
//same nonce should never be reused.

$cipher = sodium_crypto_secretbox($data, $nonce, CRYPTOKEY);

//This presents a problem because we need the nonce to decrypt the value 
//later.
//Luckily, nonces don’t have to be kept secret so we can prepend it to our 
//$ciphertext then base64_encode() the value before saving it to the 
//database.

$encoded = base64_encode($nonce . $cipher);

sodium_memzero($data);

return $encoded;

从根本上说...如果数据被加密,您将无法搜索它。解密每条记录以查看它是否包含特定值是非常难以管理的。

在这种情况下,我认为加密是不必要的。 信用卡号 等真正机密的信息可能需要加密,例如以满足 "PCI Compliance" 标准,但这些数据永远不会 "searched." 我认为对姓名和地址等内容进行加密没有任何价值。只需确保访问控制规则适用于您的数据库。