Encriptar textos en SQL – Parte 2

0
3778

Esta es la segunda parte del script para encriptar, claro ya lo hemos encriptado en la primera parte, pero ayuda mas si lo podemos desencriptar no? Obviamente lo ideal es que nadie sepa que se puede desencriptar. Hay que tener en cuenta que el script anterior (ese que puse para encriptar) diferencia entre mayúsculas y minúsculas pues trabaja con los valores binarios de cada carácter, así que cuidado con eso al momento de encriptar con este script.

Encriptar textos en SQL – Primera Parte

Muy importante: ‘ColoqueAquiSuPropiaClave’ debe ser exactamente la misma que pusieron en el script anterior… si las claves son diferentes nunca se desencriptará el texto de forma adecuada. Sigo usando el «with encryption» para que el SP no sea leíble desde el SQL (repito: ES-KIU-EL y no SICUEL).

Las explicaciones al final, hagan la prueba, solo les cuesta copiar y pegar:

ALTER PROCEDURE usp_Desencriptar
(@clave varchar(50), @texto varchar(20) output)
with encryption
as
declare @key varchar(50) 
/*Una cadena de texto cualquiera que sirve para 
cambiar el valor ingresado*/

set @key = 'ColoqueAquiSuPropiaClave'

declare @i integer, @j integer -- Contadores para las repeticiones
declare @aux integer -- Apoyo para conversiones
declare @vAsc integer -- Valor Ascii de cada caracter que se extrae del 
dato ingresado
declare @posIni integer -- Apoyo para extraer caracteres de la cadena
declare @chrBin varchar(8) -- Contendra el valor binario de cada caracter 
del texto enviado
declare @strBin varchar(320) -- Contiene la cadena binaria usada
declare @strInv varchar(320) -- La cadena binaria pero invertida por cada 
caracter

--1. Recuperar la cadena encriptada oculta
set @aux = cast(substring(ltrim(rtrim(@clave)), 3, 1) + 
substring(ltrim(rtrim(@clave)), 48, 1) as integer)
set @clave = substring(ltrim(rtrim(@clave)), (len(ltrim(rtrim(@clave))) - 4) 
- (@aux * 2), (@aux * 2))

--2. Convertir la clave en una cadena de binarios
set @i = 1
set @vAsc = 0
set @strBin = ''

while @i <= len(ltrim(rtrim(@clave)))
begin
set @chrBin = ''
set @vAsc = ascii(substring(ltrim(rtrim(@clave)), @i, 1))

while @vAsc >= 2
begin
set @chrBin = ltrim(rtrim(str(@vAsc % 2))) + ltrim(rtrim(@chrBin))
set @vAsc = @vAsc / 2
end

set @chrBin = ltrim(rtrim(str(@vAsc))) + ltrim(rtrim(@chrBin))

while len(ltrim(rtrim(@chrBin))) < 8
set @chrBin = '0' + ltrim(rtrim(@chrBin))

set @strBin = ltrim(rtrim(@strBin)) + ltrim(rtrim(@chrBin))
set @i = @i + 1
end

--3. Retirar los bits sobrantes de cada byte y unir los bits validos para 
formar la cadena original
set @i = 1
set @posIni = 1
set @strInv = ''

while @i <= len(ltrim(rtrim(@clave)))
begin
set @strInv = ltrim(rtrim(@strInv)) + substring(ltrim(rtrim(@strBin)), 
@posIni, 4)

set @posIni = @posIni + 8
set @i = @i + 1
end

--4. Invertir cada byte y luego invertir la cadena completa
set @i = 1
set @posIni = 1
set @strBin = ''

while @i <= len(ltrim(rtrim(@clave)))
begin
set @chrBin = ''
set @chrBin = substring(ltrim(rtrim(@strInv)), @posIni, 8)
set @chrBin = reverse(ltrim(rtrim(@chrBin)))
set @strBin = ltrim(rtrim(@strBin)) + ltrim(rtrim(@chrBin))

set @posIni = @posIni + 8
set @i = @i + 1
end

set @strBin = reverse(ltrim(rtrim(@strBin)))

--5. Convertir la cadena binaria en una cadena de caracteres
set @i = 1
set @posIni = 1
set @chrBin = ''
set @strInv = ''
set @strInv = ltrim(rtrim(@strBin))
set @strBin = ''

while @i <= len(ltrim(rtrim(@strInv))) / 8
begin
set @j = 0
set @aux = 1
set @vAsc = 0
set @chrBin = substring(ltrim(rtrim(@strInv)), @posIni, 8)

while @j <= (len(ltrim(rtrim(@chrBin))) - 1)
begin
set @vAsc = @vAsc + (cast(substring(ltrim(rtrim(@chrBin)), 
len(ltrim(rtrim(@chrBin))) - @j, 1) as int) * @aux)

set @aux = @aux * 2
set @j = @j + 1
end

set @strBin = ltrim(rtrim(@strBin)) + ltrim(rtrim(char(@vAsc)))
set @posIni = @posIni + 8
set @i = @i + 1
end

set @texto = ltrim(rtrim(@strBin))

return 0

go

Explicación y algo más:

Como habíamos comentado, el script anterior agregaba en la parte inicial de la cadena, caracteres al azar, con la intención de hacer perder el tiempo a quien intente desencriptarla pues siempre se empieza por la parte inicial de la cadena.

Este script toma el 3er. y el 48vo. caracter para saber la longitud de la cadena original. A esta longitud se le duplica el valor pues por cada caracter que Uds. escriban el script le da dos caracteres diferentes en base a la llave que escribieron y lo escribe desde la sexta posición hasta la posición 45, pues los dos primeros caracteres son aleatorios, el 4to. y 5to. también así como el 46vo., 47vo, 49vo y el último.

En nuestro ejemplo Hancito tenía 07 caracteres, significa que son 14 caracteres de la clave generada. Empezamos entonces a generar una cadena aleatoria en las 26 posiciones iniciales y colocamos la clave a partir de allí. Sumen 2 CA + 1 CL + 2 CA + 26 CA + 14 CE + 2 CA + 1 CL + 2 CA = 50 caracteres (CA = Caracteres Aleatorios, CL = Caracter de longitud, CE = Cadena Encriptada).

Existen muchas formas de encriptar datos y esta es una opción mas, ya sea para que la utilices o le agregues funcionalidad.

No olviden por favor las reglas que se deben seguir para crear contraseñas seguras…. Como mínimo 8 caracteres entre números, letras en mayúsculas y minúsculas y algún carácter especial. Nunca, algo relacionado con nosotros.

Si le quieren dar un poco de más de seguridad, pueden enviar la clave de encriptación desde la aplicación como un parámetro más, así esa clave estará en código binario y será un poco mas difícil poder desencriptar las contraseñas.

Dejar respuesta

Please enter your comment!
Please enter your name here