如何安全地在Android上存储密码?

时间:2015-01-25 13:43:41

标签: java android cryptography passwords password-encryption

任务是保存输入的密码(PasswordStr)或mKey.getEncoded byte [],然后自动发送到Crypto API(Cipher)

    SecretKey mKey = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").generateSecret(new PBEKeySpec(PasswordStr.toCharArray());

很明显,这个密码也可以加密,但这需要另一个密码等等。

可能Android已经提供了存储密码的机制吗?

p.s使用远程服务器是不可能的。需要在本地存储。

3 个答案:

答案 0 :(得分:3)

您可以使用Android的Keystore API

秘密由来自手机密码或密码的masterpassword加密。它被认为是一种优秀的基于软件的加密解决方案。请注意,用户必须在手机上设置密码/密码才能使其正常工作。

Nelenkov gives a good overview:

  

Android的凭据存储是作为本机Linux服务实现的   (守护进程),顶部有一些额外的层,使其可用   到框架。让我们快速回顾一下我们对密钥库的了解   守护进程(在此更详细地描述):

     
      
  • 它是一个本机守护进程,在启动时启动
  •   
  • 它提供了一个本地控制套接字,允许应用和系统服务与之通信
  •   
  • 使用AES 128位主服务器加密密钥
  •   
  • 密钥加密密钥存储在/ data / misc / keystore中,每个密钥一个文件
  •   
  • 主密钥来自设备解锁密码或PIN
  •   
  • 根据来电者UID授权管理命令执行和密钥访问
  •   

有关详细信息,请参阅Android Documentation

答案 1 :(得分:2)

检查Handling Credentials section on the android developers guide。我在这里引用它。

如果可能,用户名和密码不应存储在设备上。而是使用用户提供的用户名和密码执行初始身份验证,然后使用短期,特定于服务的授权令牌

应使用AccountManager访问多个应用程序可访问的服务。如果可能,请使用AccountManager类来调用基于云的服务,并且不要在设备上存储密码。

在传递任何凭据之前使用AccountManager检索AccountCREATOR后,您不会无意中将凭据传递给错误的应用程序。

如果凭据仅由您创建的应用程序使用,则可以使用checkSignature()验证访问AccountManager的应用程序。或者,如果只有一个应用程序将使用该凭据,您可以使用KeyStore进行存储。

答案 2 :(得分:0)

你可以使用SQLCipher来安卓android。它是SQLite的扩展,为数据库文件提供透明的256位AES加密