Как искать столбцы базы данных, зашифрованные libSodium? - PullRequest
0 голосов
/ 09 февраля 2020

Я использую SODIUM для шифрования личных данных, хранящихся в базе данных. Я могу счастливо зашифровать и расшифровать сохраненные данные. Я шифрую имена и фамилии, номера телефонов, адреса электронной почты и т. Д. c. при сохранении в базе данных.

Однако я не знаю, как искать зашифрованные данные. Может ли кто-нибудь дать указатели для шифрования данных и последующей возможности их поиска?

Например, мне нужно выполнить поиск по имени, фамилии и так далее c. но это зашифровано.

Я использую этот код для поиска и «тупо» думал о шифровании имени, но, конечно, это повторно зашифровывает его, и тогда оно отличается от фактической записи.

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;
}

Я не уверен, как даже go об этом, моя единственная мысль до сих пор - расшифровывать каждую строку, проверять и возвращать, но это такой явно некорректный способ взглянуть на это, особенно когда таблица становится больше!

Я использую приведенный ниже код для создания зашифрованной записи в столбце. Моя единственная мысль в настоящее время заключается в том, чтобы сохранить $ 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;

1 Ответ

0 голосов
/ 11 февраля 2020

Принципиально ... если данные зашифрованы, вы не можете искать их. Расшифровка каждой записи, чтобы увидеть, содержит ли она определенное значение, совершенно неуправляема.

В этом случае я бы сказал, что шифрование не нужно. Истинно секретная информация, такая как номера кредитных карт , возможно, должна быть зашифрована, например, для соответствия стандартам "PCI Compliance", но эти данные никогда не "ищутся". Я не вижу смысла в шифровании таких вещей, как имена и адреса. Просто убедитесь, что правила контроля доступа соответствуют вашей базе данных.

...