我正在制作一个应用程序,在主应用程序加载之前需要输入密码。我计划让用户在首次运行应用程序时创建密码,然后将密码存储在本地设备上,并使用本地对称密钥对其进行加密(将在应用程序首次运行时生成)。这是因为有人不能简单地读取存储密码的文件。
如何妥善存放使用的钥匙?或者是否有更好的方法隐藏存储的密码以用于本地验证?
该应用专为离线使用而设计,因此无法添加任何网络功能。
答案 0 :(得分:0)
您可以在私人模式下使用SharedPreferences来存储密码。只要手机没有root,它就是安全的,但您可以使用加密技术来存储密码。我在本地存储密码的方法是在存储时向密码添加SALT。 您可以阅读更多相关信息here
答案 1 :(得分: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
存储密码。当用户再次输入密码时,再次对其进行哈希处理并检查它是否与先前的哈希相同。如果哈希匹配,则授予访问权限。
答案 2 :(得分:0)
请先阅读Thomas 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模式下);只需使用不同的盐和不同的迭代次数。如果您只是这样做,那么您甚至不需要密码哈希;只需尝试使用生成的密钥和存储的盐和迭代次数对文件进行解密 - 如果有效,则为正确的密码。如果它失败了,那就不是了。