Foro de elhacker.net

Seguridad Informática => Criptografía => Mensaje iniciado por: matake en 12 Julio 2016, 21:15 pm



Título: Dudas con IV y salt
Publicado por: matake en 12 Julio 2016, 21:15 pm
Hola,

Encontré por la web una librería javascript CryptoJS y quiero emplearla en un proyecto pero como no se muchas cosas de criptografia por esto pongo aquí mis dudas.

Hice pruebas y pude cifrar en el cliente con CryptoJS AES256 y escogiendo una passphrase la libreria genera IV y salt aleatorio.

La passphrase no se envia por la red sino via SMS

Pero el mensaje cifrado (chipertext) el  IV y el salt debo enviarlos por la red ( con https ) para poder desencriptarlo al otro lado.

Mi primera duda es la siguente:
¿compromete mucho la seguridad si un supuesto atacante ( aunque sea por https) accede al IV y al salt  sin tener (teroricamente al menos) acceso a la passphrase que va por otra via ?

La segunda duda:
¿Una passphrase de aproximadamente 100 caracteres sera razonablemente fuerte ?

Gracias

P.D
Estoy consciente que no existe seguridad 100% ... solo busco que sea bastante fuerte



A no ser que no he entendido bien ... despues de investigar un poco mas sobre el asunto, dicen por ahi que el IV y la sal son publicos ... y que lo que tiene mas importancia es la aletoriedad de los mismos.

asi que mi primera duda cambiaria en:

¿como puedo probar la calidad de la dicha aletoriedad?

La libreria de la cual dije en el principio es esta :
https://github.com/brainfoolong/cryptojs-aes-php (https://github.com/brainfoolong/cryptojs-aes-php)

MOD EDIT: No hacer doble post.


Título: Re: Dudas con IV y salt
Publicado por: kub0x en 13 Julio 2016, 15:28 pm
Así es, el IV y salt deben entregarse al otro extremo para el desciframiento. Ten en cuenta que el IV/salt hacen que un mismo plaintext o mensaje se cifre de diferente manera, por lo tanto preserva la confidencialidad, sin que un atacante pueda distinguir el mismo mensaje de dos ciphertext.

Sobre el tema de la clave, lo ideal, es que tenga el tamaño en bytes recomendado, para así cumplir con los requirimientos de seguridad en AES. Para ello tendrás que formar la Master password a través de una KDF (Key Derivation Function), como bcrypt o PBKDF2. No te asustes, estas funciones toman tu password y forman una de mayor tamaño, en caso de AES formarán una de 256 bytes (el tamaño ideal para la mejor seguridad).

Ahora para probar la calidad de la aletoriedad, bueno fíjate ten este fragmento de código extraído del git de la librería JS:

Código
  1. function cryptoJsAesEncrypt($passphrase, $value){
  2.    $salt = openssl_random_pseudo_bytes(8);
  3.    $salted = '';
  4.    $dx = '';
  5.    while (strlen($salted) < 48) {
  6.        $dx = md5($dx.$passphrase.$salt, true);
  7.        $salted .= $dx;
  8.    }
  9.    $key = substr($salted, 0, 32);
  10.    $iv  = substr($salted, 32,16);
  11.    $encrypted_data = openssl_encrypt(json_encode($value), 'aes-256-cbc', $key, true, $iv);
  12.    $data = array("ct" => base64_encode($encrypted_data), "iv" => bin2hex($iv), "s" => bin2hex($salt));
  13.    return json_encode($data);
  14. }

Como ves primero genera un salt aleatorio con OpenSSL (OpenSSL utiliza algoritmos de generación criptograficamente seguros) para luego en la variable salted concatenar sucesivos hashes MD5 compuestos por la passphrase, el salt y el hash anterior.
Después obtiene la key de los 32 primeros bytes de la variable anterior, el IV de 16 bytes a partir del byte 32 de la misma variable.

Lo mejor es dejarse de líos y utilizar una KDF estandar, ya que la liberia CryptoJsAES implementa una KDF no estandarizada empleada por OpenSSL:

Citar
CryptoJS uses the non-standardized OpenSSL KDF for key derivation (EvpKDF) with MD5 as the hashing algorithm and 1 iteration. The IV is also derived from the password which means that only the actual ciphertext, the password and the salt are needed to decrypt this on Java side.

Saludos!


Título: Re: Dudas con IV y salt
Publicado por: matake en 14 Julio 2016, 02:41 am
Muchas gracias por responder @kub0x y con la misma ocasión felicitarte por los aportes tuyos ( algunos que he leído por aquí ), también por la manera de explicar y aguantar preguntas ( a veces idiotas ) que ponen principiantes (como yo). Estoy intentando aprender ( al vuelo ) ciertas cosas, conceptos ( hasta el idioma Español lo aprendi "a la oreja" por la calle asi que por anticipado pido perdón por alguna falta de ortografia o por algun que otra pregunta tonta. Gracias

Volviendo al tema:

1. Me di cuenta (despues de los mensajes anteriores) que la libreria que encontre era parte de una libreria mas grande que estaba antes en google code y de la cual se guarda una copia entera en github https://github.com/sytelus/CryptoJS (https://github.com/sytelus/CryptoJS)

En la cual he encontrado tambien una libreria PBKDF2.js y pensaba ya en usar algo asi en la parte javascript ( incluso encontre algunos ejemplos ) algo como
Código
  1. var salt = CryptoJS.lib.WordArray.random(128/8);
  2. var key512Bits1000Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 512/32, iterations: 1000 });

Y en el servidor usar hash_pbkdf2 que encontre en el manual de PHP http://php.net/manual/es/function.hash-pbkdf2.php (http://php.net/manual/es/function.hash-pbkdf2.php)

O sea en vez de usar el git que puse en el mensaje anterior tal cual estaba ( sobre el cual me explicaste lo del md5)

emplear como me dijiste  :
Citar
Lo mejor es dejarse de líos y utilizar una KDF estandar,

Ahora lo que no he entendido bien (o sea me confunde un poco y es por lo de idioma creo ) es la misma frase que he citado arriba.

Citar
Dejarse de lios
¿se refiere a dejar de emplear CryptoJS? , o ¿se refiere a la parte del codigo que me comentaste tu en el mensaje anterior ( la que empleaba md5 )?

Suponiendo que lo que quierias decir era esto de no usar el codigo tal cual (con lo del md5)  ¿valdria algo como puse al principio con PBKDF2.js en el cliente y  hash_pbkdf2 en el servidor ?

Luego lo de las iteraciones en PBKDF2 .... bfff hablan por ahi de 64,000 iterationes o mas . ¿Es esto cierto ? o solo son cosas teoricas ?

Saludos y gracias



Título: Re: Dudas con IV y salt
Publicado por: kub0x en 14 Julio 2016, 18:46 pm
Gracias por el apoyo matake, me gusta arrojar luz a este subforo, que es de los más oscuros  :D

Con dejarse de líos realmente me refería a utilizar PBDKF2 (Password based KDF) ya que la que cité (md5 + openssl) solo utiliza 1 sola iteración (malditos negligentes), no es estándar y se considera insegura.

En el RFC de PBKDF2 recomiendan 1000, los de OWASP 64.000 + un valor aleatorio para securizar el proceso. En ciertas comunidades recomiendan medir el tiempo de las iteraciones en milisegundos de la KDF siendo el líimte 9ms (creo). Con partir desde mil e ir subiendo basta.

Citar
4.2 Iteration Count

   An iteration count has traditionally served the purpose of increasing
   the cost of producing keys from a password, thereby also increasing
   the difficulty of attack. For the methods in this document, a minimum
   of 1000 iterations is recommended. This will increase the cost of
   exhaustive search for passwords significantly, without a noticeable
   impact in the cost of deriving individual keys.

Las KDF devuelven un output del tamaño que quieras, dicho output lo puedes partir para derivar la clave simétrica y el IV. Por lo tanto sólo necesitas la passphrase y el salt. Recuerda que AES sin GCM o una MAC no provee de integridad, así que el esquema queda suceptible a modificaciones.

Con TLS (HTTPS) podrás negociar la clave simétrica sin peligro, ya que después de verificar su certificado, sólo esa persona podrá descifrar los parámetros a negociar (esto es RSA, lo más básico). A partir de ahi se derivan las claves de cifrado (sesión) y de integridad de los mensajes.

Por lo que veo quieres implementar AES sobre TLS y hacer tu propia librería de https o implementación.

Información:

https://tools.ietf.org/html/rfc2898
https://crypto.stackexchange.com/questions/5440/can-i-use-my-random-iv-for-aes-as-a-salt-for-pbkdf2
https://crypto.stackexchange.com/questions/3484/pbkdf2-and-salt

Saludos!


Título: Re: Dudas con IV y salt
Publicado por: matake en 15 Julio 2016, 02:29 am
Muchas gracias otra vez para los consejos que me diste (por ejemplo lo del MAC no tenia ni idea ) grand detalle a tener en cuenta.
Ya he encontrado algo que viene con la misma libreria js ej:
Código
  1. var HMAC = CryptoJS.HmacSHA256(encryptObject.toString(), key);

Ahora a leer mas y a practicar :)

Muchas gracias para todo


P.D.

Citar
Por lo que veo quieres implementar AES sobre TLS y hacer tu propia librería de https o implementación.

Pues algo por el estilo , aunque con mis escasos conocimientos sobre el tema no me atreveria llamarla "mi libreria" ...
Seria un intento de hacer un poco mas dificil el robo de contraseñas y sesiones ( una mezcla de varios conceptos que ya existen como contraseña compuesta de varias palabras del diccionario al azar ... con un segundo factor autentificacion ( estilo tarjeta coordenadas de los bancos ) enviado por correo fisico y una mezcla de estas dos para generar tokens cifrados AES dentro de TLS ) sin que se guarde nunca en el servidor dichas "pass phrases" ( ni siquiera hashes sobre ellas )


Aaaaa y otra vez felicitaciones acabo de leer su otro aporte sobre "El teorema de la resta China" ... Muy bueno ... He leido hace unos años "El arte de la guerra" de Sun Tzu ... Impresionante

Saludos y gracias