2011-11-28 13 views
8

Quiero saber si se pueden usar claves simétricas para firmar un mensaje? Podemos encrpyt usando la clave secreta compartida. Además, cuando se utiliza la clave simétrica para la firma, ¿qué API se puede usar en JAVA para cargar la clave y firmar el mensaje?Usando una clave simétrica (AES -128) para firmar y verificar un mensaje

si utilicé la firma de java.security, tiene una API initSign pero toma la clave privada del par de claves pública/privada como argumento para firmar el mensaje. Aquí la clave es clave simétrica.

¿Alguna sugerencia?

Respuesta

11

Una clave secreta compartida se puede utilizar para calcular un Message Authentication Code (MAC), que luego se puede utilizar para confirmar la integridad y autenticidad del mensaje a otra parte que conoce el mismo secreto compartido. A diferencia de las firmas digitales, que se crean usando la clave privada y se verifican usando la clave pública, los MAC no ofrecen el no repudio (cualquiera que pueda verificar el MAC también puede generar un MAC para otro mensaje).

Existen diferentes formas de códigos de autenticación de mensajes; probablemente la variación más utilizada es HMAC.

1

Si desea firmar un mensaje utilizando una clave simbólica, desea utilizar un CMAC basado en AES (o TDEA de 3 teclas o Cameilla). Los CMAC son Códigos de Autenticación de Mensaje (MAC) construidos encima de las cifras de bloque. Por lo general, utiliza un CMAC si también está utilizando AES/3TDEA/Cameilla para el cifrado (es decir, es útil).

También puede usar un HMAC. Un HMAC es un Código de Autenticación de Mensaje (MAC) construido sobre un hash. Usted usaría un HMAC que es un hash que ya estaba presente en el programa (es decir, que era útil).

Cuando tengo un Cifrado de bloque y Hash presente en el programa, generalmente uso un HMAC porque es más rápido.

Finalmente (para completar), no use MD5. Está roto (a pesar de lo que piensan muchos en el mundo del software libre). SHA-1 ya no está aprobado para nuevas aplicaciones por organismos como NIST, NESSIE y ECRYPT. Use la familia de hash SHA-2 o use Whirlpool.

Para las cosas específicas de java, vea Java Cryptography Extensions.

6

Los algoritmos simétricos no pueden dar la propiedad de no repudio que otorgan los esquemas de firmas asimétricos, es decir, el receptor de un mensaje no puede probar que no creó el mensaje, ya que deben conocer el esquema.

Dicho esto, un message authentication code (MAC) puede darle lo que quiere: Tanto el emisor como el receptor tienen una clave compartida, el emisor calcula un MAC con el secreto y lo anexa al mensaje, y el receptor calcula la mismo MAC y lo compara con el mensaje recibido.

Mientras que el tipo MAC más a menudo utilizado (HMAC) se basa en las funciones de hash, también son los que se basan en un cifrado en bloque como AES, como CBC-MAC (esto es como CBC, pero con vector cero de inicialización y utilizando sólo el último bloque como salida). (Como dice noloader, CBC-MAC no es la forma más segura de hacerlo, use otros modos).

Debe usar la autenticación de mensajes en la mayoría de los casos en que usa encriptación, ya que muchos esquemas de cifrado son vulnerables a los elegidos- ataques de texto claro.

En Java, se puede calcular (y verificar) un MAC utilizando la clase javax.crypto.Mac.

+1

CBC-MAC está roto para mensajes de longitud variable. Un CMAC es un CBC-MAC hecho bien. – jww

+0

Lo siento, pero todavía no estoy seguro. ¿Qué determina el tamaño de la clave que se utilizará para HMAC? Entiendo que puedo usar HMAC sobre CMAC. Pero la clave que tengo es aes 128. ¿Se puede usar eso? por ejemplo: clave SecretKey = nueva clave secreta (clave, "AES") – user839917

+0

Preferiblemente, debe usar una clave diferente (independiente) para MAC y cifrado, aunque HMAC es bastante diferente, por lo que usar la misma clave no dará problemas. Puede usar cualquier longitud de clave que desee para HMAC (hasta la longitud del bloque de funciones hash) (aunque no sé si su implementación lo admite), simplemente se rellenará con cero hasta la longitud del bloque de su función hash. Las teclas más grandes brindan más seguridad, aunque no se obtendrá mejor que el tamaño de salida de las funciones hash (= tamaño MAC). –

Cuestiones relacionadas