DotNetcr.com
Si deseas hacer un intercambio de links con DotNetcr, escríbenos aquí
Recibe las actualizaciones vía RSS
Te invitamos a unirte en nuestras redes
   http://www.facebook.com/DotNetcr
   http://www.twitter.com/dotnetcr

Encriptar textos en SQL - Segunda Parte

Por h@nz | 9/25/2006 | Visitas 17,969 | Voto 4.00
Segunda parte del tema "Encriptar Textos", aquí vamos a desarrollar el procedimiento para desencriptar el texto encriptado en la parte 1. Siguiendo ciertas reglas para que nadie pueda desifrar nuestro texto.
Categorías : SQL Server
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 caracter 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 dificil poder desencriptar las contraseñas.
Area de Comentarios
Por Anónimo - Fecha: 2006/12/04 04:35 PM
Hola, muy interesante el articulo, lo probe pero pasa algo con la letra p, no la desencripta bien, podrias decirme que podra estar pasando? gracias
Por h@nz - Fecha: 2006/12/11 09:08 AM
Me parece raro lo que me dices, acabo de probar los procedimientos (el de encriptación y el de desencriptación) haciendo un copiar y pegar desde estas páginas y sale sin ningún problema.

En todo caso lo que podría estar pasando es que haya un conflicto con la llave que estas usando, si el algoritmo funciona conmigo debe funcionar también contigo, y ya que el único dato que puede ser diferente es la llave, te sugiero entonces probar con otra llave, aunque eso ya demuestra un detalle que considerar en este procedimiento.

Saludos...
Por Anónimo - Fecha: 2007/06/28 10:12 PM
y si quiero Encriptar una cadena mayo a 100 Caracteres, ¿que es lo que tengo que modificar en los procedimientos almacenados?
Por Anónimo - Fecha: 2008/05/08 09:04 AM
La rutina de encripcion tiene llave pero la de desencripcion NO!!!. Asi las cosas el algoritmo es totalmente obsoleto.
Por Anónimo - Fecha: 2008/07/10 08:55 PM
Hola, una pregunta como prodria delimitar ciertos caracteres del código ASCII a mostrar en el código generado, y otra es de como puedo generar una cadena de 300 caracteres y no solo de 20, se que es mucho pedir pero me seria de gran ayuda.

Gracias
Por Anónimo - Fecha: 2008/11/28 12:28 PM
Hola, al desencriptar puse lo sgte.

usp_Desencriptar ''miclave'' , ''Ø®0ÏGR".§øXÄýûœbÇ>µïsíÝ+=p_jïNÀ6m6]6M6=6-6ÉQ6ã~''

Error de sintaxis al convertir el valor varchar ''i'' para una columna de tipo de datos int.

a que se debe?
Por Anónimo - Fecha: 2011/12/28 09:17 AM
Extremely helpful atrilce, please write more.
Por Anónimo - Fecha: 2011/12/29 05:55 AM
M3tznQ , [url=http://wvltkbywbbse.com/]wvltkbywbbse[/url], [link=http://kpisvkjasrza.com/]kpisvkjasrza[/link], http://jqhgmrwxyhnm.com/
Por Anónimo - Fecha: 2011/12/31 08:49 AM
GJUlxn , [url=http://iznkxarzqwoe.com/]iznkxarzqwoe[/url], [link=http://fkqaaexvrcpl.com/]fkqaaexvrcpl[/link], http://ltgxkebvfpbm.com/
Ingrese su Comentario
Comentario
Para poder votar debe estar registrado en DotNetcr.com
Solo queda registrado el primer voto enviado
Voto


Últimos Recursos
ricardo leppe t
pedrojavier
CALIN
willipinru
richard
ragomez
PER 238
MEX 236
CRI 188
COL 118
ESP 105
ARG 88