Guardar o SSNs numa base de dados

Estou a trabalhar numa aplicação web que os utilizadores terão de enviar os seus números de segurança social.

gostaria de usar chaves assimétricas para a encriptação, por isso, se o servidor web estiver comprometido, a chave privada continuará a ser segura. A aplicação não será processada no servidor web.

no entanto, o aplicativo precisa da capacidade de saber se o SSN é um duplicado para a não permitir duplicados e B para permitir que os usuários voltem para sua aplicação.

Isto pode ser feito? Será que faz sentido usar um hash de uma maneira semelhante ao modo como as senhas são armazenadas ou isso comprometerá os dados?

Obrigado antecipadamente.

-- edit

Estou a acrescentar à pergunta depois de pensar um pouco mais sobre isso.

Já que só há aprox. 10 Biliões De SSNs. Isso faz alguma Alg arrojada. susceptível a ataques de Força bruta. Um sal ajuda aqui. Se o sal é conhecido, não é ainda susceptível à Força bruta? É possível esconder devidamente um sal, pois se alguém tem acesso à base de dados que também têm acesso ao sal?

Author: harlyd, 2015-08-16

2 answers

Não encripte os seus SSNs, espalhe-os

Parece que você deveria estar a fazer 'hashing' os SSNs em vez de encriptá-los. A diferença entre os dois é que hashing é de um só sentido, enquanto a criptografia não é. Mas como você não precisa verificar o valor dos dados, apenas a integridade, eu definitivamente usaria hashing porque

  1. o Hashing é mais seguro do que a encriptação, pois os SSNs hashed não podem ser desapertados
  2. a lavagem ainda lhe permite verificar o integridade dos dados e verifique se há SSNs duplicados em sua base de dados.

Como hash

Se estiver a usar o PHP 5 > = 5, 5, 0, eu iria fortemente recomendar a utilização do PHP incorporado em funções de lavagem de senhas . É uma batalha testada e criada para esta situação. Ele mesmo auto gera seu próprio sal seguro (mas ainda tem a opção de você fornecer o seu próprio).

Leia Atentamente a documentação sobre as funções de lavagem de senhas, mas um pequeno exemplo (extraído do exemplo do docs) está abaixo:

<?php
// To create the password hash:
$ssn = password_hash($ssn, PASSWORD_DEFAULT);
// To verify the integrity of what the user is entering
// In this example, $hash is the hashed password generated from password_hash
if (password_verify('rasmuslerdorf', $hash)) {
    echo 'SSN is valid!';
} else {
    echo 'Invalid SSN.';
}
?>

Lembre-se de verificar os documentos sobre as funções de lavagem da senha, por isso use-as correctamente:

 1
Author: Tim, 2015-08-16 17:42:56
Um pouco tarde para o jogo, mas fiz uma abordagem dupla. Dividimos a SSN em duas partes:
  1. XXX-XX
  2. 3847

A primeira parte do SSN está encriptada usando algum algoritmo de encriptação (blowfish?) ou qualquer sabor que você escolher.

A base de dados:

--------------------------------------------------------
| ID    |   SSN-A    |   SSN-B    | ......   |         |
--------------------------------------------------------
|   1   | N1maA+HCRj |    3847    |    ...   |         |
|   2   | HCRjHQiEx/ |    7254    |    ...   |         |
--------------------------------------------------------

Quando os registos são exportados ou despejados num CSV para consumo por outra entidade, pode descodificar a primeira parte do SSN, um a um, e depois remontar o completa SSN.

Desde que a chave esteja guardada de forma segura, há um razoável sentido de segurança aqui. O benefício adicional disto é-embora você não possa fazer uma pesquisa SSN inteira, você pode pelo menos limitá-los usando os últimos 4 dígitos. Há um conjunto completo de regulamentos em torno do armazenamento SSN's, por isso, qualquer maneira que você escolher - tenha cuidado.

Editar

Também seria provavelmente sensato nomear as colunas algo não determinístico de um campo SSN.

 1
Author: Barry Chapman, 2017-10-09 18:24:28