Pregunta

Estamos desarrollando un servicio que aceptará un POST pedido.Algunos de los POST Los datos deberán cifrarse antes de que POST ya que se almacenará en campos ocultos en un formulario.

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

Los terceros solo deberían realizar 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?

¿Fue útil?

Solución

Suponiendo que tenga una forma segura de compartir una clave (ya sea encriptación RSA, recuperación a través de un enlace SSH o HTTPS, o llamada al otro desarrollador a través de una línea telefónica segura), cualquiera de los principales cifrados modernos (como AES, como se mencionó por @Ed Haber) sería adecuado.Apoyaría su sugerencia de AES.Debería haber bibliotecas para PHP, VB, Ruby, etc.

Sin embargo, recuerde que sin "comunicación bidireccional" tendrá que encontrar un método fuera del canal para hacer llegar de forma segura la clave simétrica a la parte que cifra.

Otros consejos

Si quiere decir que debería ser imposible para terceros descifrar datos, entonces querrá utilizar un algoritmo de cifrado asimétrico como RSA.Este será el tercero que cifrará los datos con su clave pública, y luego solo usted podrá descifrar los datos con su clave privada, que no revela.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á una clave que compartirá con terceros.Esta clave se utiliza tanto para cifrado como para descifrado.

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

Ed Haber dijo

Usaría AES para el cifrado de datos a granel y RSA para cifrar la tecla AES.Si los datos son lo suficientemente pequeños, simplemente cifre todo con RSA.

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

Hay algunos problemas con el método anterior.Dado que no envía 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 utilizar formas muy inseguras para generar la clave de sesión y usted nunca lo sabrá.Un segundo problema es que todos los que quieran enviarle datos tienen que rellenar los datos para AES de la misma manera que usted.Así que tendrás que asegurarte de que todos se coordinen.El segundo problema no es demasiado grande, pero el primero podría ser un problema, especialmente si no confías mucho en los terceros para generar claves de sesión realmente buenas a partir de un buen generador de números aleatorios criptográficamente seguro.

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

Aquí hay un ejemplo de 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;
}

ColdFusion tiene funciones de cifrado y descifrado capaces de manejar una variedad de algoritmos y codificaciones, incluido el AES recomendado anteriormente.

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

Código de ejemplo rápido:

Key = generateSecretKey( 'AES' , 128 )

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

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

Una 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

Parece que RSA es el algoritmo para usted.

¿Por qué no exponer su servidor a través de HTTPS?De esa forma, cualquier cliente que pueda manejar HTTPS podrá consumir el servicio de forma segura.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top