4

我正在开发一个基于网络服务器的 Android 应用程序。安装该应用程序的用户应在网络上注册,以便他们可以登录。当有人尝试登录时,我会使用API.

所以我对持久化和加密过程很好奇。我应该加密这些值还是将它们全部放入SharedPreferences?如果需要加密,那么有效的方法是什么?

最后但并非最不重要的一点是,SharedPreferences 在安全性方面是否足够?

谢谢。

4

2 回答 2

3

加密很容易,但真正的问题是使用什么密钥?如果您在应用程序中对密钥进行硬编码,或从某个已知值派生密钥,则任何有权访问设备的人都可以轻松解密这些值。您正在实现的只是混淆。由于 Android 没有系统密钥库的公共 API,因此如果您需要保存实际密码,则无能为力。当然,除非您让用户在每次启动应用程序时都输入密码,否则就达不到目的了。

如果您同时控制服务器和客户端,另一种方法是使用某种形式的基于令牌的身份验证,并且只保存令牌。由于令牌可能会过期并被撤销,因此持有令牌的人造成的损害要比暴露实际密码(也可以在其他网站上使用)要小得多。

于 2012-07-25T07:04:48.337 回答
2

当然,您应该加密用户设置,例如登录名、密码或电子邮件。我更喜欢SharedPreferences存储,是的,就安全性而言,这已经足够了。

我在 StackOverflow 上找到了这两种方法,这很公平:

protected String encrypt( String value ) {
    try {
        final byte[] bytes = value!=null ? value.getBytes(UTF8) : new byte[0];
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
        SecretKey key = keyFactory.generateSecret(new PBEKeySpec(SEKRIT));
        Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
        pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(Settings.Secure.getString(context.getContentResolver(),Settings.System.ANDROID_ID).getBytes(UTF8), 20));
        return new String(Base64.encode(pbeCipher.doFinal(bytes), Base64.NO_WRAP),UTF8);
    } catch( Exception e ) {
        throw new RuntimeException(e);
    }
}

protected String decrypt(String value){
    try {
        final byte[] bytes = value!=null ? Base64.decode(value,Base64.DEFAULT) : new byte[0];
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
        SecretKey key = keyFactory.generateSecret(new PBEKeySpec(SEKRIT));
        Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
        pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(Settings.Secure.getString(context.getContentResolver(),Settings.System.ANDROID_ID).getBytes(UTF8), 20));
        return new String(pbeCipher.doFinal(bytes),UTF8);
    } catch( Exception e) {
        throw new RuntimeException(e);
    }
}

找不到链接,如果我找到了,我会编辑我的答案。

编辑:我找到了来源,你可以看看这里的所有讨论。

于 2012-07-25T06:51:15.140 回答