Foros del Web » Programando para Internet » ASP Clásico »

Encriptación SQL Server y ASP

Estas en el tema de Encriptación SQL Server y ASP en el foro de ASP Clásico en Foros del Web. Buenas! Este tema no sé si debe ir en ASP o en SQL Server, pero me parece que es mas propio aquí. Tengo un procedimiento ...
  #1 (permalink)  
Antiguo 14/05/2008, 03:55
 
Fecha de Ingreso: marzo-2008
Mensajes: 12
Antigüedad: 17 años, 1 mes
Puntos: 0
Encriptación SQL Server y ASP

Buenas!

Este tema no sé si debe ir en ASP o en SQL Server, pero me parece que es mas propio aquí.

Tengo un procedimiento almacenado de la siguiente forma

Código PHP:
CREATE PROCEDURE ep.sp_datos_cliente
    
(
        @
IdCliente int,
        @
Clave nvarchar(50)    
    )
AS
BEGIN

    SET NOCOUNT ON
;

    DECLARE @
KEYID INT

    EXEC ep
.sp_id_clave_asimetrica @KEYID = @KEYID OUTPUT

    SELECT  CAST
(DecryptByAsymKey(@KEYIDPass, @Clave) AS varchar(MAX)) AS Pass 
    FROM Clientes
    WHERE IdCliente 
= @IdCliente
END 
El campo "Pass" guarda la contraseña encriptada en el servidor. Ejecutando este procedimiento almacenado desde SQL Server veo la contraseña desencriptada y correctamente.

Sin embargo, al recogerlo desde ASP, el campo aparece vacío. Como información adicional, si recojo otros campos de la base de datos todos se muestran correctamente.

El código ASP no tiene nada, simplemente crear un procedimiento almacenado y recoger los valores (lo tengo todo creado con funciones, así que no tiene mucho sentido).

Código PHP:
CrearSP sp"ep.sp_datos_cliente"
            
ParamIN sp"IdCliente"adVarChar10016
(etc)
                
EjecutarSP rssp

Response
.Write rs("Pass"
Deciros que este código está probado y funcionando en mil procedimientos, sólo falla al leer campos codificados.

¿Alguna idea? He probado cambiando los tipos de parámetros como adWVarChar, etc. Y nada...

Gracias de antemano
  #2 (permalink)  
Antiguo 14/05/2008, 07:16
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Re: Encriptación SQL Server y ASP

Solo para confirmar .....

- Si ese SP lo corres desde el analizar de consultas, te regreso todos los campos (encripatados y no encriptados) correctamente, ¿es verdad?

- Ese SP lo haz probado en otras palataforma y funciona SOLAMENTE falla en ASP , ¿es verdad?

-¿Cuántos registros te va a regresar ese SP? (Si te regresa solo uno, podrías probar con parámetros de salida)

Sería más útil saber que hacen los procedimientos ParamIN y EjecutarSP.

Saludos
  #3 (permalink)  
Antiguo 14/05/2008, 08:24
 
Fecha de Ingreso: marzo-2008
Mensajes: 12
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Encriptación SQL Server y ASP

Gracias por tu interés, Myakire.

- Desde el analizador de consultas, los resultados son correctos (por eso sospecho que el fallo está en el código ASP).

- Sólo lo he probado en un servidor Windows con ASP y SQL Server (Express, por si nos puede ser útil) instalado.

- En principio sólo devolverá un registro, aunque no descarto la posibilidad de que en el futuro devuelva más. He probado con parámetros de salida y el resultado es el mismo: campos sin encriptar correctos, campos encriptados vacíos.

Aquí está el código de las funciones:

Código:
public sub CrearSP(byRef adocmd, nombreSP)

	set adocmd = Server.CreateObject("ADODB.Command")

	'Procedimiento Almacenado
	adocmd.CommandText = nombreSP
	
	adocmd.ActiveConnection = SGM_Conexion_x
	adocmd.CommandType = adCmdStoredProc
	
	'HayErrores()
	
end sub

public sub ParamIN(byRef sp, nombre, tipo, tam, valor)

	On Error Resume Next
	
	if tipo = adVarchar then valor = Left(valor, tam)

	sp.Parameters.Append sp.CreateParameter(nombre, tipo, adParamInput, tam, valor)
	
	if Err.Number <> 0 then
		Response.Write "Error en par&aacute;metro: " & nombre
	end if
	
	On Error GoTo 0

end sub

public sub ParamOUT(byRef sp, nombre, tipo, tam)

	sp.Parameters.Append sp.CreateParameter(nombre, tipo, adParamOutput, tam)

end sub

public sub EjecutarSP(byref RecSet, byRef sp)

	On Error Resume Next
	
	set RecSet = sp.Execute
	
	if Err.Number <> 0 then 
		Response.Redirect "error.asp"
	end if
	
end sub
No da ningún error, simplemente aparece el campo vacío.

He probado pasando como parámetros adWVarChar en lugar de adVarChar, porque el procedimiento almacenado para desencriptar utiliza el tipo nvarchar.

* Nota: También he probado ejecutando la SQL que llama al procedimiento almacenado directamente, la misma que genera el analizador de consultas, y el resultado es el mismo: vacío.

Muchas gracias por tu colaboración.
  #4 (permalink)  
Antiguo 14/05/2008, 08:49
 
Fecha de Ingreso: marzo-2008
Mensajes: 12
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Encriptación SQL Server y ASP

He probado también lo siguiente:

Código:
SELECT Nombre, 
CAST(DecryptByAsymKey(256, A, N'$$miClave$$') AS varchar(MAX)) AS Pass 
FROM Clientes WHERE IdCliente = 1
El mismo código, ejecutado desde SQL Server da el valor correcto, pero desde ASP no...

Última edición por ivanargulo; 14/05/2008 a las 09:10
  #5 (permalink)  
Antiguo 14/05/2008, 14:10
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Re: Encriptación SQL Server y ASP

mmmmmmmm, es extraño

No me he topado con algo así, ....., ¿el resultado de esa encriptación son caracteres imprimibles? ¿qué es lo que generas? ¿dentro de qué rango del ascii están?
  #6 (permalink)  
Antiguo 14/05/2008, 15:16
 
Fecha de Ingreso: marzo-2008
Mensajes: 12
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Encriptación SQL Server y ASP

Consiste en crear una clave de encriptación, en mi caso la he creado asimétrica. Se almacena en un campo tipo varbinary.

Código:
CREATE ASYMMETRIC KEY ClaveAsimetrica
WITH ALGORITHM = RSA_2048
ENCRYPTION BY PASSWORD = '$$Clave$$'
Para insertar un valor encriptado (es una cadena de texto normal y corriente, con todos los caracteres ASCII.

Código:
DECLARE @KEYID INT
SET @KEYID = AsymKey_ID('ClaveAsym')

INSERT INTO TARJETAS (NUMERO)
VALUES (EncryptByAsymKey(@KEYID, 'Cadena a encriptar'))
Así el valor aparece ilegible.

Hasta aquí todo correcto. El problema viene al hacer el proceso inverso:

Código:
DECLARE @KEYID INT
SET @KEYID = AsymKey_ID('ClaveAsym')

SELECT CAST(DecryptByAsymKey(@KEYID,numero, N'$$Clave$$') AS VARCHAR(100))
FROM TARJETAS
Éste es el paso que me devuelve vacío. En teoría, el resultado es una cadena tipo nvarchar (unicode), pero como se ve en todos los ejemplos, hago el paso a varchar para que sea correctamente leído.

El resultado debería ser la cadena que codificamos al comienzo: "Cadena a encriptar". Es perfectamente imprimible. Es más, te digo la cadena exacta que debería devolver en mi caso: sgm. Como ves, no hay caracteres raros.

Pues bien, todo ello va a la perfección en SQL Server Management Studio, pero no desde ASP. El resultado es una cadena NULA. No lo entiendo...

Gracias por el tiempo!!

Última edición por ivanargulo; 14/05/2008 a las 15:45
  #7 (permalink)  
Antiguo 14/05/2008, 15:35
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 18 años, 2 meses
Puntos: 88
Re: Encriptación SQL Server y ASP

, solo una preguntita, esta "N" va dentro del codigo???
Cita:
SELECT CAST(DecryptByAsymKey(@KEYID,numero, N'$$Clave$$') AS VARCHAR(100))
__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
  #8 (permalink)  
Antiguo 14/05/2008, 15:40
 
Fecha de Ingreso: marzo-2008
Mensajes: 12
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Encriptación SQL Server y ASP

Sí y no. No va en el procedimiento almacenado porque se declara el parámetro como nvarchar, y así se le pasa desde ASP.

En mis múltiples pruebas he llegado a ejecutar directamente la SQL desde ASP, con la cadena embebida en el código. En ese caso sí hay que poner la N, para que convierta una cadena normal en una unicode.

Código:
N'cadena' = CAST('cadena' AS nvarchar(6)
Pero ni por esas funciona :S

Gracias a ti también :)
  #9 (permalink)  
Antiguo 14/05/2008, 15:57
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Re: Encriptación SQL Server y ASP

Bueno, ya con ese código veo que no es cosa del ASP, te falta crear un master key desde el TSQL.

Pueba con esto:

Código:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = N'bmsA$dk7i82bv55foajsd9764';

CREATE ASYMMETRIC KEY ClaveAsimetrica
WITH ALGORITHM = RSA_2048;

INSERT INTO TARJETAS (NUMERO)
VALUES (EncryptByAsymKey(AsymKey_ID('ClaveAsimetrica'), '$$Clave$$'))

SELECT NUMERO, 
       CAST(DecryptByAsymKey(AsymKey_ID('ClaveAsimetrica'), NUMERO) as VARCHAR)
AS DecryptedData 
FROM TARJETAS
  #10 (permalink)  
Antiguo 14/05/2008, 15:59
 
Fecha de Ingreso: marzo-2008
Mensajes: 12
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Encriptación SQL Server y ASP

Probaré y te cuento, pero un master key sólo es necesario en claves simétricas (de hecho, ahí no la estás usando). Yo uso clave asimétrica.

Lo que me extraña es que desde SQL Server todo se vea perfecto, y desde ASP no...

Gracias.
  #11 (permalink)  
Antiguo 14/05/2008, 16:02
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Re: Encriptación SQL Server y ASP

Prueba y me dices ............. deja igual hago una prueba más a fondo
  #12 (permalink)  
Antiguo 14/05/2008, 16:03
 
Fecha de Ingreso: marzo-2008
Mensajes: 12
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Encriptación SQL Server y ASP

¿Lo has probado desde ASP? ¿O desde el Query Analizer?
  #13 (permalink)  
Antiguo 14/05/2008, 16:23
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Re: Encriptación SQL Server y ASP

Debo pedirte disculpas ..
al probar ya en ASP, veo que efectivamente regresa un nulo

Código:
<%
	set con = Server.CreateObject("ADODB.Connection")
  ConnString = "Provider=SQLNCLI;Server=192.168.0.1;Database="&vBD&";Uid=cccc;Pwd=ccccc;Initial Catalog=pruebas"
  Con.CommandTimeout  = 0
  con.Open  ConnString

  Set cmd=server.CreateObject("ADODB.command")
  Set cmd.ActiveConnection = Con
	
  cmd.CommandText = "DROP ASYMMETRIC KEY ClaveAsimetrica; " &_
	                  "CREATE ASYMMETRIC KEY ClaveAsimetrica WITH ALGORITHM = RSA_2048; " &_
                    "INSERT INTO TEST (ClaveTxt, ClaveEncrip) VALUES ('$$Clave$$', EncryptByAsymKey(AsymKey_ID('ClaveAsimetrica'), '$$Clave$$'))"

  cmd.Execute	

  set rs = Server.CreateObject("ADODB.RecordSet")
  rs.Open "SELECT ClaveTxt, ClaveEncrip, IsNull(CAST(DecryptByAsymKey(AsymKey_ID('@Password'), ClaveEncrip) as CHAR(10)),'nulo') AS DecryptedData FROM TEST", con
	
  response.write "Clave Texto: " & rs(0) & "<br>"
  response.BinaryWrite "Clave Original: " & rs("DecryptedData") & "<br>"
%>
Dame unos minutos para seguir investigando
  #14 (permalink)  
Antiguo 14/05/2008, 16:43
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Re: Encriptación SQL Server y ASP

Bueno, parece que el problema es del proveedor del SQL que no regresa el dato al IIS, pero haciéndolo directamente en la BD ya funciona dado que con parámetros de salida lo hace bien:
Código:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[spValida]
@Clave char(10) output
AS
BEGIN
	SET NOCOUNT ON;


CREATE ASYMMETRIC KEY ClaveAsimetrica
WITH ALGORITHM = RSA_2048;

INSERT INTO TEST (ClaveTxt, ClaveEncrip)
VALUES ('$$Clave$$', EncryptByAsymKey(AsymKey_ID('ClaveAsimetrica'), '$$Clave$$'))

SELECT @Clave = 
       CAST(DecryptByAsymKey(AsymKey_ID('ClaveAsimetrica'), ClaveEncrip) as VARCHAR)
FROM TEST

END
Y el código ASP:
Código:
   cmd.CommandText = "spValida"
 	 cmd.CommandType=adCmdStoredProc
   cmd.Parameters.Append (cmd.CreateParameter("@Clave",      adchar, adParamOutput,10))
	 cmd.Prepared = True
	 cmd.Execute
	 
	 response.write "Valor: " & cmd.Parameters("@Clave")
Esto por fin, da el resultado esperado

Saludos!
  #15 (permalink)  
Antiguo 15/05/2008, 01:27
 
Fecha de Ingreso: marzo-2008
Mensajes: 12
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Encriptación SQL Server y ASP

Veo que lo único distinto es el tipo de parámetro de salida: adchar..

Voy a probar. La pena es que solo funciona si hay un solo registro y no con todo un recordset, pero en fin.

Con lo que sea contesto. Saludos y gracias!
  #16 (permalink)  
Antiguo 15/05/2008, 08:31
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Re: Encriptación SQL Server y ASP

Pues según he probado, si se puede regresar un RecordSet con múltiples filas desencriptadas, pero siempre y cuando sea por medio de un SP, lo cual constata que el problema esta en el proveedor de la BD con el IIS.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:29.