0

我正在制作一个应用程序,要求在加载主应用程序之前输入密码。我计划让用户在第一次运行应用程序时创建密码,然后将密码存储在本地设备上,并使用本地对称密钥(将在应用程序第一次运行时生成)对其进行加密。这是因为有人不能简单地读取存储密码的文件。存储用于离线使用的对称密钥

如何储存安全使用的钥匙?还是有更好的方法来隐藏存储的密码以用于本地验证?

该应用程序是专为离线使用,所以我不能添加任何网络功能。

回答

0

您可以在私人模式下使用SharedPreferences来存储密码。只要电话不是固定的,但是您可以使用加密技术来存储密码。我在本地存储密码的方法是在存储时向密码添加SALT。 你可以阅读更多关于它here

0

对密码安全的方式 - 哈希。由于密码在散列过程中丢失,所以散列永远无法解密。我使用MD5哈希处理下面的代码 -

public String StringToMD5(String s) { 
try { 
    // Create MD5 Hash 
    MessageDigest digest = java.security.MessageDigest.getInstance("MD5"); 
    digest.update(s.getBytes()); 
    byte messageDigest[] = digest.digest(); 

    // Create Hex String 
    StringBuffer hexString = new StringBuffer(); 
    for (int i=0; i<messageDigest.length; i++) 
      M hexString.append(Integer.toHexString(0xFF & messageDigest[i])); 
    return hexString.toString(); 

} catch (NoSuchAlgorithmException e) { 
    e.printStackTrace(); 
} 
return ""; 
} 

使用此代码以哈希密码,然后保存它使用Private SharedPreferences。当用户再次输入密码时,再次对其进行散列并检查它是否与之前的散列相同。如果哈希匹配,则授予访问权限。

+1

Downvoted由于单次通过(从不使用只是单次通过),MD5(不要使用MD5),和一个缺盐(不要使用无盐密码)。 –

0

请阅读托马斯Pornin的canonical answer to How to securely hash passwords?开始。

PBKDF2选项在问题PBKDF2 function in Android列出,但包括天然SecretKeyFactory方法以及Spongycastle,BouncyCastle的,rtner.de等

龙,加密随机每个密码盐是必需的(腾出空间为未来的发展增加一个以上的密码!)。

永远不要问PBKDF2更多的密钥长度比本机功能支持更多 - PBKDF2-HMAC-SHA-512为64字节,PBKDF2-HMAC-SHA-1为20字节。

始终使用尽可能高的迭代计数为您的用户能够忍受。即使对于android设备,对于自己设备上的单个用户,在应用程序启动时仅执行一次,对于PBKDF2-HMAC-SHA-1,成千上万或更多,对于PBKDF2-HMAC-SHA,成千上万或更多-512。

注意PBKDF2的主要用途是创建加密密钥 - 您可以使用相同的密码输入的为您生成加密使用AES文件(而不是在ECB模式)的加密密钥;只是使用不同的盐和不同数量的迭代。如果你只是这样做,那么你甚至不需要密码哈希;只需尝试使用生成的密钥和存储的迭代次数来解密文件 - 如果有效,那就是正确的密码。如果失败,那不是。