2012-05-10 28 views
5

En mi aplicación iOS4 + utilizo el cifrado AES en varios lugares y toda la aplicación tiene que ser muy segura. Para hacer esto, tengo que codificar varias claves en esta aplicación que luego se seleccionan al azar cuando necesito encriptar algo ...Manera segura de guardar claves de cifrado en iOS

Mi pregunta es cómo almacenar esas claves privadas? ¿Es seguro codificarlos usando NSString? O

#define SecretKeyString @"febd9a24d8b65c1c787d50a4ed3619a9" 

Si el usuario jailbreaks iPhone con esta aplicación instalada, ¿no podría obtener esas teclas codificadas? ¿Cómo puedo ocultarlos de manera más efectiva?

Gracias por cualquier sugerencia ...

Respuesta

4

Qué aplicaciones a otros hacer es requiere que el usuario "entrar" antes de que puedan utilizar la aplicación. Luego usa su ID de usuario/contraseña como clave para cifrar las claves o usa un servicio web seguro para obtener las claves para ese usuario.

Si usa un #define o incluso un NSString, hay formas de adivinar las claves. Obviamente, tiene que estar realmente dispuesto a pasar mucho tiempo buscando esas claves en el código compilado, pero dependiendo del nivel de seguridad que esté buscando y de las personas contra las que está protegiendo, esto podría ser un problema.

+0

así no puedo utilizar inicio de sesión información como claves, sería genial :) i necesita tener varias claves estáticas, las cuales serán codificados. .. pero esta podría ser realmente una buena solución - si tengo 5 claves, 4 de ellas serán encriptadas y tendré que descifrarlas con la primera clave y solo entonces se convertirán en claves válidas para la criptación ... nadie alguna vez descubriría las claves reales, incluso si encontrara esas claves en código compilado ... ¡gracias!:) –

+2

Si realmente está paranoico sobre si se pueden leer sus claves codificadas, una de las opciones sería almacenar sus claves transformadas. Luego, tenga un método para transformar la clave almacenada en la clave real. Por ejemplo, una transformación trivial sería cadena inversa. Entonces, si su clave es ABC, codificaría CBA y llamará al método inverso cada vez que quiera usar su clave. Por supuesto, en la aplicación real, desearías algo un poco más complejo que solo invertir. Solo un pensamiento adicional ... – mprivat

+0

exactamente ... algo como esto suena realmente sólido ... y no soy paranoico, tampoco creo que sea un gran problema, pero tengo que hacerlo en el trabajo y son paranoicos :) ¡gracias de nuevo! –

2

Recomiendo leer algunos artículos sobre seguridad por ofuscación, que es esencialmente lo que estás tratando de lograr (al menos eso es lo que dicen todas las recomendaciones) y que en última instancia no son seguros.

Sin embargo, el espacio aislado de iOS es su primera y más efectiva forma de seguridad.

En segundo lugar, la validación de entrada será la siguiente característica de seguridad más importante que necesitará su aplicación. Tener el cifrado completo no significa nada si no validas todas tus entradas (desde la información escrita por el usuario, hasta las respuestas de la red al lanzamiento de la aplicación a través de un esquema).

Al final, el cifrado seguro, donde sea necesario, solo es seguro si no se trata de un hardcore (u oscurece la codificación). mprivat es correcto, deberá usar datos generados por el usuario (un inicio de sesión), un cifrado de clave pública (para que solo la clave privada no incluida pueda descifrar) o un cifrado del lado del servidor que use SSL para el transporte.

También diría que si sus datos de seguridad solo se van a mantener en el dispositivo que utiliza la API de llavero, y en particular, asegúrese de usar el formulario que requiere que el usuario inicie sesión para la recuperación de elementos .

Si tiene datos cifrados en el dispositivo que se descifra tanto en el dispositivo como en otro dispositivo (como un servidor), tiene un defecto arquitectónico fundamental. Es muy importante que el cifrado-descifrado solo sea cliente-cliente (también conocido como el dispositivo del usuario) o cliente-servidor (que puede ser el dispositivo del usuario en el servidor o el servidor en el dispositivo del usuario). Mezcla los dos resultados en vulnerabilidades. Me refiero específicamente al mismo mecanismo de cifrado aquí, usar una encriptación separada para cliente-cliente vs cliente-servidor está bien (y algunas veces es necesario).

Aquí es una lectura obligada para aquellos que están necesidad de escribir código seguro: http://www.amazon.com/gp/aw/d/0735617228

Cuestiones relacionadas