Em uma pergunta recente, O que a Chave Mestra de Serviço protege? , foi sugerido que a chave mestra do serviço protege, entre outras coisas, dados criptografados por ENCRYPTPASSPHRASE()
. Isso é verdade?
relate perguntas
-
SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado
-
Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?
-
Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?
-
Quais são as principais causas de deadlocks e podem ser evitadas?
-
Como determinar se um Índice é necessário ou necessário
Não, isso não é verdade, e há uma prova fácil. Em um servidor, crie um banco de dados e armazene alguns dados usando
ENCRYPTBYPASSPHRASE()
:Agora, faça backup do banco de dados:
Agora, em um servidor diferente em um domínio diferente ou onde você se sentir confortável acreditando que não há anexos ocultos para alguma chave mestra de serviço, restaure o banco de dados:
Por fim, recupere os dados da cópia restaurada e observe que ainda é possível descriptografá-los:
Os resultados devem ser:
Portanto, isso significa que, se um usuário obtiver seus dados e souber a frase secreta (por exemplo, se você os armazenou em algum lugar no mesmo banco de dados), eles podem descriptografar todos os dados sem se preocupar com chaves ou qualquer outra coisa. Você pode inferir disso que
ENCRYPTBYPASSPHRASE()
não é uma maneira muito segura de armazenar senhas, a menos que você nunca armazene a frase secreta digitada por um usuário ou a menos que use outras ferramentas e métodos além disso (escopo rastejante).Como observação lateral, confesso que não tenho absolutamente nenhuma ideia de como
ENCRYPTBYPASSPHRASE()
realmente funciona internamente, além do fato de usar criptografia Triple DES (3DES). É não determinístico - portanto, pode usar algo comoNEWID()
ouRAND()
internamente - seu palpite é tão bom quanto o meu. Eu sei que, se você executar o seguinte, obterá um valor binário diferente a cada vez e, se pegar qualquer um dos valores de saída individuais e executarDECRYPTBYPASSPHRASE()
contra esse valor, ainda assim retornará ao original:Na verdade, você pode tentar isso em seu próprio sistema. Aqui está um dos valores binários que gerei e, se você inverter o processo, também deverá obter
turkey
: