Mostrando entradas con la etiqueta c#. Mostrar todas las entradas
Mostrando entradas con la etiqueta c#. Mostrar todas las entradas

martes, 16 de agosto de 2011

Encriptar Información Parte IIa (Usted no lo haga)



Continuando con esta serie de post sobre la encriptación de datos o como me corrigió mi amigo Mario el termino correcto sería codificación de información, antes de entrar en tierra firme y explicar todos los tipos de encriptación voy a ahondar en las malas practicas utilizadas por muchos desarrolladores que piensan que están haciendo sus sitios seguros y protegiendo la información cuando en realidad solo están agregando líneas de código inservibles para el fin que se está solicitando, ¿Por qué les pasa esto?, muy simple, les pasa por que no entienden y no se dan el tiempo de tratar de entender lo que están haciendo, sin ir mas lejos he conocido programadores que logran entregar productos y que no saben explicar cosas tan básicas como lo que significa una clase, una interfaz, herencia, para ellos es hablar otro idioma cuando se les consulta por el patrón singleton o clases abstractas.

Al momento de encriptar información una de las malas prácticas más comunes es la codificación XOR, sin ir más lejos una empresa que empieza con servi…. la ocupaba hace poco en sus url, ésta codificación ocupa la lógica matemática del “o exclusivo” la cual dice que es un tipo de disyunción lógica de dos operandos que es verdad si solo un operando es verdad pero no ambos. En programación el manejo se hace tomando el universo no incluido en los binarios a comparar.

Si en c# realizáramos un XOR entre los enteros 10 y 12, este nos devolvería un 6 y la logica que ocurriría sería la siguiente

int A = 10 ^ 12;

donde

10 = 1010

12 = 1110

A = 110

Es fácil reconocer que lo que se realizó fue una suma de números binarios, explicado esto vamos a un ejemplo de este tipo de codificación.

Como codificar:

public static byte[] Codificar(byte[] cadena)

{

for (int _i = 0; _i < cadena.Length; _i++)

cadena [_i] = (byte)(15 ^ bytACodificar[_i]);

return cadena;

}

Si se fijan a cada elemento del vector de byte le realizó un XOR con un número fijo (en este caso es 15) el cual ocuparé para decodificar la cadena como se ve en la siguiente función:

public static byte[] DeCodificar(byte[] cadena)

{

for (int _i = 0; _i < cadena.Length; _i++)

cadena[_i] = (byte)(15 ^ cadena[_i]);

return cadena;

}

No hay diferencia en las funciones solo se aplica una simple conmutatividad, ¿cuanto se demora un atacante en descifrar esto?, menos de lo que te has demorado en leer el artículo, si aplicáramos esto en un código lo haríamos de la siguiente forma:

String text = "Pablo Hormazabal rlz.";

System.Text.ASCIIEncoding codificador = new System.Text.ASCIIEncoding();

byte[] texto = Codificar(codificador.GetBytes(text));

System.Console.WriteLine(codificador.GetString(texto));

texto = DeCodificar(texto);

System.Console.WriteLine(codificador.GetString(texto));

System.Console.ReadKey();

El resultado es el siguiente:


viernes, 5 de agosto de 2011

Escritorio remoto desde c#

Hoy aprendí algo muy entretenido, el como hacer mi propio escritorio remoto con c#, suena complejo pero es realmente fácil. Lo primero que se debe hacer es agregar en el toolbox un COM llamado Microsoft RDP Client Control.


Lo agregamos en nuestro formulario:

Le damos el nombre que queremos en este caso de ejemplo le ponemos eRemoto y agregamos el siguiente código, en este caso está en el contructor de la clase Formulario y está todo en duro solo por que es un ejemplo, si quieren implementarlo deben hacerlo de una manera mas limpia y parametrizable

public FrmRControl()

{

InitializeComponent();

eRemoto.Name = "Conexión 1";

eRemoto.Server = "ip";

eRemoto.UserName = "nombreusuario";

eRemoto.Domain = "Dominio";

eRemoto.AdvancedSettings2.ClearTextPassword = "clave";

eRemoto.AdvancedSettings2.ConnectToServerConsole = true;

eRemoto.AdvancedSettings2.RDPPort = 3389;

eRemoto.AdvancedSettings2.RedirectDrives = true;

eRemoto.AdvancedSettings2.RedirectPrinters = true;

eRemoto.AdvancedSettings2.RedirectPorts = true;

eRemoto.Connect();

}

Si los parametros están ok al compilar inmediatamente se conectará de forma remota.




miércoles, 20 de julio de 2011

LLamada a un metodo XML-RPC

XML-RPC es un protocolo desarrollado por Microsoft en conjunto con un ingeniero (no recuerdo el nombre) de la empresa UserLand Software a fines de los 90, ocupa XML como medio de codificación de datos y el protocolo http para la transmisión de mensajes, si bien es un protocolo simple y muy básico en cuanto a funcionalidades es la base de lo conocemos actualmente como SOAP. La invocación de estos servicios no es una tarea compleja pero debido a la escasa literatura que existe respecto a este tema he decidido dar un ejemplo de su implementación esperando que a más de a uno lo ayude.

Para llevar a cabo la invocación se necesita lo siguiente:

1) la Dirección Web en donde está alojado el servicio a llamar (url).

2) El XML con los parámetros de entrada y las especificaciones del método(xmlparam).

El XML tiene la siguiente estructura

<?xml version="1.0"?>
<methodCall>
<methodName>Nombre metodo</methodName>
<params>
<param>
<value><i4>valor</i4></value>
</param>
</params>
</methodCall>

Sabiendo esto la llamada la hacemos de la siguiente forma:

public string LLamadaXMLRPC(string url, string xmlparam)

{

WebRequest webRequest = WebRequest.Create(url);

webRequest.ContentType = "application/x-www-form-urlencoded";

webRequest.Method = "POST";

byte[] bytes = Encoding.ASCII.GetBytes(xmlparam);

Stream os = null;

try

{ // send the Post

webRequest.ContentLength = bytes.Length; //Count bytes to send

os = webRequest.GetRequestStream();

os.Write(bytes, 0, bytes.Length); //Send it

}

catch (WebException ex)

{

//

}

finally

{

if (os != null)

{

os.Close();

}

}

try

{ // get the response

WebResponse webResponse = webRequest.GetResponse();

if (webResponse == null)

{ return null; }

StreamReader sr = new StreamReader(webResponse.GetResponseStream());

return sr.ReadToEnd().Trim();

}

catch (WebException ex)

{

//

}

return null;

}

Al ver el código se darán cuenta que la llamada es a través de un POST y tiene como propiedad "application/x-www-form-urlencoded", esto tiene como función codificar todos los caracteres antes de que sean enviados.