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.