consulta encriptada en el servidor sql

Quiero ejecutar una consulta en el servidor de nuestro cliente usando eliminar acceso. Si ejecuto una consulta algo como esto Update abc set col1=12 where id = 2 entenderán lo que estamos haciendo. Así que quiero algún método de cifrado y descifrado como este:

En nuestro servidor encripto una consulta como esta:

encrypt(Update abc set col1=12 where id = 2)

Entonces obtengo una salida como:

0x0100CF465B7B12625EF019E157120D58DD46569AC7BF4118455D12625EF019E157120D58DD46569AC7BF4118455D

Y ejecuto esta consulta cifrada en la máquina del cliente de esta manera:

decrypt(0x0100CF465B7B12625EF019E157120D58DD46569AC7BF4118455D12625EF019E157120D58DD46569AC7BF4118455D)

Entonces nuestro cliente no puede entender lo que hemos ejecutado.

preguntado el 04 de julio de 12 a las 09:07

Interesante idea, pero ¿cuál es la pregunta? -

Qué requisito tan extraño, ¿qué nivel de acceso tiene su cliente a la base de datos, qué nivel de acceso tiene usted? -

Si está ejecutando de forma remota, ¿cómo sabrán lo que está haciendo? Si están ejecutando y observando con SQL Profiler, esto no ofuscará nada. Solo te haría parecer sombrío. -

¿Qué les impide usar el decrypt ¿función? -

@ypercube Por supuesto que es legal. Son personas técnicas. Si ven nuestras consultas, pueden capturarlas y ejecutarlas nuevamente. Entonces, ¿por qué deberíamos mostrarles nuestras consultas? -

3 Respuestas

puede crear una función de descifrado simple como esta ...

create proc exec_decrypt(@sql_str varbinary(8000))
as
begin
declare @qry varchar(8000);
select @qry=cast(@sql_str as varchar(8000));
exec(@qry);
end

que acepta una cadena varbinary y la convierte en varchar y luego la ejecuta.

Puede generar la consulta encriptada utilizando el estado a continuación

select CAST('UPDATE users set name =''alex''' as varbinary(8000))

luego ejecute el proc exec_decrypt en el lugar del cliente pasando el resultado de la consulta anterior como parámetro para el procedimiento.

Ex:  exec_decrypt 0x55504441544520757365727320736574206E616D65203D27616C657827

Espero que esto funcione para usted. Tenga en cuenta que el cliente no debe tener ningún permiso en el proceso exec_decrypt

Respondido 04 Jul 12, 11:07

"Tenga en cuenta que el cliente no debe tener ningún permiso en el proceso exec_decrypt". Sin mencionar StackOverflow ;-) - vstrien

@joe G Joseph El procedimiento que ha mostrado está bien. ¿Pero no podemos aumentar la longitud de varbinary? - Himanshu Jansari

Puede usar varbinary (MAX) si lo necesita. varbinary(8000) es más que suficiente para consultas normales - jose g jose

use varbinary (MAX) en lugar de solo varbinary, porque si no especificamos la longitud, solo tomará 30 caracteres. Cambiaré mi guión original ahora.. - jose g jose

Esto es ofuscación, no encriptación. Es una técnica bastante conocida utilizada en ataques de inyección SQL. por ejemplo, ver aquí. Sin embargo, tal vez podría funcionar si el cliente no tiene ni idea. - MS.

La única forma que he encontrado para asegurarme de que nadie pueda ver sus consultas es ponerlas en una función o procedimiento usando 'con cifrado'. Ejecute el siguiente código para verlo usted mismo. El SQL dinámico sugerido en la respuesta anterior no resuelve completamente su problema.

create procedure dbo.dummy_drop_me with encryption as select t.* from sys.dm_exec_requests r cross apply sys.dm_exec_sql_text (r.sql_handle) t where r.session_id = @@spid
go
exec dbo.dummy_drop_me
go
select t.* from sys.dm_exec_requests r cross apply sys.dm_exec_sql_text (r.sql_handle) t where r.session_id = @@spid
go
exec ('select t.* from sys.dm_exec_requests r cross apply sys.dm_exec_sql_text (r.sql_handle) t where r.session_id = @@spid')

La única forma que he encontrado para evitar que alguien capture sus funciones y procedimientos es crearlos en su propia base de datos en un servidor al que nadie tiene acceso. Luego, adjunte una copia de la base de datos a los servidores donde los necesite.

respondido 26 mar '18, 18:03

En mi opinión, con cifrado es generalmente contraproducente ya que hay una serie de herramientas de descifrado de Sql Server. es decir, DB Decryptor de dbForge. Acabo de usar esto para descifrar el T-SQL de una base de datos, por lo que podría exportar DACPAC y BACPAC para usar en implementaciones automatizadas de Azure DevOps. con cifrado hace que las exportaciones de DACPAC y BACPAC fallen. Esto significa que si implementa con cifrado no puede usar DACPAC para crear scripts de actualización para DB Patches o actualizaciones directas, no puede usar proyectos de Visual Studio Sql Server Tools, lo que dificulta el desarrollo de DB. No ha asegurado nada, solo ha hecho que sea más difícil para Dev y Op para hacer su trabajo.

Respondido el 11 de Septiembre de 19 a las 16:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.