Estou iniciando um projeto de criptografia, usando EncryptByPassPhrase()
, principalmente em VARCHAR
valores. Naturalmente, os valores criptografados são mais longos que os originais. Existe uma fórmula que posso usar para calcular quanto tempo preciso para criar os novos VARBINARY
campos, de modo a manter qualquer valor possível do VARCHAR
campo original?
Por exemplo, o primeiro campo que examinei tem valores de até 37 caracteres de comprimento e os valores criptografados têm até 100 bytes; outro tem valores de até 50 caracteres e os valores criptografados são de até 124 bytes. No entanto, valores tão curtos quanto dois ou três caracteres podem criptografar até 76 bytes. Se eu dimensionar os novos campos como 75 + X bytes, terei espaço para armazenar a versão criptografada de qualquer valor de texto possível de comprimento X ou menos?
No que diz respeito aos meus testes (usando SQL Server Express 2014, SP1 e SQL Server Developer 2012 SP2, ambos 64-it), a fórmula ao não usar um autenticador para o valor de retorno (
VARBINARY
) comprimento de:é:
Tente o seguinte:
Retorna:
E, se você alterar o tipo de dados de
@ClearText
para serNVARCHAR(4000)
e executá-lo novamente, ele retornará:Observação: a fórmula parece que pode ser reduzida cancelando o
8
s. No entanto, isso fará com que ele não funcione corretamente, pois são faixas de comprimentos de dados que cabem em um "balde":Portanto, a
(DATALENGTH(@ClearText) / 8)
parte da fórmula impõe que os valores decimais sejam ignorados em vez de o valor ser arredondado. E isso é feito pelo comportamento padrão de dividir dois valores INT ;-).ATUALIZAR:
O teste feito acima não usa uma opção disponível para ENCRYPTBYPASSPHRASE : especificando um "autenticador". Fazer isso adiciona 16 bytes ao comprimento mínimo e, enquanto os incrementos ainda estão em etapas de 8 bytes e enquanto os intervalos de faixas ainda são de 8 bytes cada, o intervalo inicial é de apenas 4 bytes, portanto, os intervalos são compensados por 4 como em comparação com os limites do intervalo quando não estiver usando um autenticador. Para ajudar a ilustrar, o gráfico a seguir mostra os intervalos e seus comprimentos de resultado correspondentes:
A fórmula ao usar um autenticador
VARBINARY
para o comprimento do valor de retorno ( ) de:é:
NOTAS:
PassPhrase
não tem efeito no comprimento do resultadoPassPhrase
não tem efeito no comprimento do resultadoAuthenticator
valor tenha algum efeito, o valor deAdd_Authenticator
(o 3º parâmetro de entrada) deve ser definido como1
Authenticator
não tem efeito no comprimento do resultado , desde que seja pelo menos 1 .Authenticator
terá um efeito no comprimento do resultado, e esse efeito é o mesmo que definirAdd_Authenticator
para0
.Add_Authenticator
for definido como0
, ouAuthenticator
for uma string vazia ouNULL
, a fórmula será a mesma como se não houvesse "autenticador".O seguinte é um teste expandido e aprimorado que mostra com e sem um "autenticador" e facilita a alteração do
@PassPhrase
valor:Isso não é científico; a única maneira de obter a resposta científica seria examinar o código que os desenvolvedores do SQL Server usaram para implementar o algoritmo 3DES 128.
Dito isto, construiu um equipamento de teste rápido que tenta determinar o tamanho prático do texto criptografado.
Isso gera senhas e dados de comprimento variável entre 1 e 4.000 bytes e, em seguida, compara a saída da
ENCRYPTBYPASSPHRASE
função com o comprimento dos dados inseridos. Descobri, no meu computador, que há entre 41 e 48 bytes "extras" na saída.Dito isso, sugiro usar
VARBINARY(8000)
como tamanho do campo, pois essa é a saída máxima definida para a função.Eu me deparei com isso para determinar o comprimento dos dados varbinary após criptografar com enryptbypassphrase