2008-09-19 61 views
7

Estamos desarrollando un servicio que aceptará una solicitud de POST. Algunos de los datos de POST deberán cifrarse antes del POST, ya que se almacenarán en campos ocultos en un formulario.Encriptación compatible entre C# y PHP, ColdFusion, Ruby, Python

La aplicación está escrita en C#, pero queremos que los clientes de terceros puedan integrarse fácilmente con ella. Encontramos que la mayoría de los clientes usan PHP, Classic ASP o VB.Net.

Los terceros solo deben hacer el cifrado. Nosotros haríamos el descifrado. No hay comunicación bidireccional.

¿Cuáles son las combinaciones más compatibles de algoritmo de cifrado, modo de relleno y otras opciones?

Respuesta

4

Asumiendo que usted tiene una forma segura de compartir una clave (si el cifrado RSA de la misma, la recuperación de más de una SSH o un enlace HTTPS, o llamar al otro desarrollador en una línea telefónica segura), cualquiera de las encriptaciones modernas más importantes (como AES, como lo menciona @Ed Haber) sería adecuada. Apoyaría su sugerencia de AES. Debe haber bibliotecas para PHP, VB, Ruby, etc.

Sin embargo, recuerde que con "no hay comunicación bidireccional" tendrá que encontrar un método fuera del canal para obtener de forma segura la clave simétrica del cifrado fiesta.

0

Parece que RSA es el algoritmo para ti.

2

Usaría AES para el cifrado de datos masivos y RSA para cifrar la clave AES. Si los datos son lo suficientemente pequeños, solo encripte todo con RSA.

-3

Acabo de completar recientemente una aplicación que conecta una variable GET encriptada de Coldfusion a PHP usando SHA-256.

código de ColdFusion:

<cfset var strHash = Hash(arguments.hashstring,"SHA-256") /> 

código PHP:

hash('sha256', $strKey); 

supongo que C# sería capaz de manejar algo que los haría, ya que es un lenguaje bastante maduro. He aquí un ejemplo de la página web de MSDN para la clase SHA256:

byte[] data = new byte[DATA_SIZE]; 
byte[] result; 
SHA256 shaM = new SHA256Managed(); 
result = shaM.ComputeHash(data); 

Aquí está el enlace de MSDN: SHA256 Class

+2

Hashing no es encriptación. g es unidireccional, y no puede (bueno, no debería poder) deshacerse para un costo de cálculo razonable. –

3

Si quiere decir que debería ser imposible para terceros descifrar datos, entonces querrá usar un algoritmo de encriptación asimétrico como RSA. Esto hará que el tercero cifre los datos con su clave pública, y solo usted podrá descifrar los datos con su clave privada, que no divulgará. Debería haber implementaciones de RSA disponibles para todos los idiomas que mencionó.

Si no le importa si el tercero puede descifrar los datos, entonces AES es el camino a seguir. Tendrás una clave que compartirás con terceros. Esta clave se usa tanto para el cifrado como para el descifrado.

1

Podría implementar fácilmente su propio cifrado de bits basado en claves XOR. Con un poco de pensamiento e ingenio, puede encontrar algo que sea más que adecuado para su aplicación.

Aquí está un ejemplo PHP:

function XOREncryption($InputString, $KeyPhrase){ 

    $KeyPhraseLength = strlen($KeyPhrase); 

    for ($i = 0; $i < strlen($InputString); $i++){ 

     $rPos = $i % $KeyPhraseLength; 

     $r = ord($InputString[$i])^ord($KeyPhrase[$rPos]); 

     $InputString[$i] = chr($r); 
    } 

    return $InputString; 
} 
1

ColdFusion tiene el cifrar y descifrar las funciones capaces de manejar una variedad de algoritmos y codificaciones, incluyendo el AES recomendado anteriormente.

información en: http://www.cfquickdocs.com/cf8/?getDoc=encrypt#Encrypt

rápida código de ejemplo:

Key = generateSecretKey('AES' , 128) 

EncryptedText = encrypt(Text , Key , 'AES' , 'Hex') 

Text = decrypt(EncryptedText , Key, 'AES' , 'Hex') 

funcionalidad similar está disponible con esta biblioteca para PHP :
http://www.chilkatsoft.com/p/php_aes.asp

... y Java, Python, Ruby, y otros ...
http://www.example-code.com/java/crypt2_aes_matchPhp.asp
http://www.example-code.com/python/aes_stringEncryption.asp

2

Ed Haber said

me gustaría utilizar AES para el cifrado de datos en bloque y RSA para cifrar la clave AES . Si los datos son lo suficientemente pequeños , simplemente encripte todo con RSA.

Creo que esta es una buena solución. Lo que haría es hacer que su aplicación publique una API para obtener una clave RSA pública. Cuando un tercero desea enviarle algo, obtiene la clave pública. Luego genera una clave de sesión para hacer el cifrado real usando un cifrado de bloque, (es decir, AES), y le envía la clave encriptando con su clave pública. Usted descifra la clave de sesión con su clave privada. El tercero luego cifra los datos que desea enviarle con AES (utilizando un esquema de relleno que también publica) y se los envía a usted. Lo descifras usando la clave de sesión.

Existen algunos problemas con el método anterior. Como no está enviando ninguna información (aparte de publicar su clave pública, no puede controlar cómo se genera la clave de sesión. Esto significa que terceros pueden usar formas muy inseguras de generar la clave de sesión y usted nunca lo sabrá. Un segundo problema es que todos los que desean enviarle datos tienen que rellenar los datos de AES de la misma manera que usted. Por lo tanto, deberá asegurarse de que cada uno coordine. El segundo problema no es demasiado grande, pero el primero podría ser un problema. especialmente si no confía demasiado en los terceros para generar claves de sesión realmente buenas a partir de un buen generador de números aleatorios criptográficamente seguro

0

¿Por qué no expone su servidor a través de HTTPS? De esta forma, cualquier cliente que pueda manejar HTTPS puede consuma el servicio de forma segura.

Cuestiones relacionadas