2011-03-19 25 views
14

Estoy creando una aplicación para almacenar datos cifrados.Almacenar una contraseña

En this pregunta, el OP si aconseja almacenar la credencial del usuario en claro.

Pero, ¿qué sucede si me gustaría almacenar una contraseña cifrada creada con SecretKeySpec (la utilizada para encriptar datos)? Según entiendo, la clave secreta está encriptada.

Así que puedo almacenar y recuperarlo.

Nota: No estoy preguntando cómo almacenar las preferencias, solo si mi comprensión de cómo funciona SecretKeySpec y cómo, tipo de, serializar y recuperar la contraseña encriptada.

EDITAR: Lo siento, se olvidó de especificar lo que debe ser compatible con la API de nivel 4.

Respuesta

11

Directamente desde developer website.

Sea inteligente Acerca de Security!

Es importante comprender que AccountManager no es un servicio de cifrado o un llavero. Almacena las credenciales de la cuenta tal como las pasa, en texto sin formato. En la mayoría de los dispositivos, esto no es una preocupación particular, ya que los almacena en una base de datos a la que solo se puede acceder desde la raíz. Pero en un dispositivo rooteado, las credenciales podrían ser leídas por cualquier persona con acceso adb al dispositivo.

Con esto en mente, no debe pasar la contraseña real del usuario a AccountManager.addAccountExplicitly(). En su lugar, debe almacenar un token criptográficamente seguro que sería de uso limitado para un atacante. Si sus credenciales de usuario protegen algo valioso, debe considerar cuidadosamente hacer algo similar.

Recuerde: Cuando se trata de código de seguridad, siga la regla de "Mythbusters": ¡no intente esto en casa! Consulte a un profesional de seguridad antes de implementar cualquier código de cuenta personalizado.

Ahora que las cláusulas de exención de responsabilidad están fuera del camino, es hora de volver al trabajo. Ya has implementado la carne de tu código de cuenta personalizado; lo que queda es la fontanería.

6

Wow. Realmente no creo que almacenar la contraseña del usuario en el claro es una opción seria.

Consulte AccountManager que fue diseñado para este propósito. Aunque se votó negativamente en la pregunta a la que se vinculó, SampleSyncAdapter es realmente un buen recurso para un ejemplo de AccountManager, y el único que conozco incluido con el SDK.

Editar - sobre javax.crypto, creo que es una API de nivel más bajo que AccountManager. A partir de los documentos:

Muchos servidores soportan alguna noción de un token de autenticación , que puede ser utilizado para autenticar una solicitud al servidor sin enviar contraseña real del usuario. (Tokens de autenticación se crean normalmente con un petición por separado, sí incluye las credenciales del usuario.) AccountManager puede generar tokens de autenticación para aplicaciones, por lo que la aplicación no necesita directamente a contraseñas mango. Los tokens de autenticación son normalmente reutilizables y almacenados en caché por AccountManager, pero se deben actualizar periódicamente. Es la responsabilidad de las aplicaciones de invalidar los tokens de autenticación cuando dejan de funcionar para que el administrador de cuentas sepa que necesita regenerarlos.

No me gustaría tratar con esto en el nivel de javax.crypto si no fuera necesario.

+0

Suena bien. Muy bien. Pero necesito permanecer compatible con el nivel 4 de API (edité la pregunta, lo siento). De todos modos +1 –

-4

u simplemente puede declarar tanto nombre de usuario y contraseña como una sentencia if si la condición coincide u puede comenzar la actividad en caso de mal u simplemente puede generar una tostada de mal input.but u no puede retreive contraseña de allí si u perdido por cualquier medio, pero puede crear muchas contraseñas para un solo usuario. Agregué esto a mi aplicación y funcionó bien para mí.

Cuestiones relacionadas