2012-07-25 56 views
4

我正在开发基于Web服务器的Android应用程序。安装该应用程序的用户应该在网上注册,以便他们可以登录。当有人尝试登录时,我使用API验证他们的信息。如何在Android中加密会话值

所以我很好奇坚持和加密处理。我应该加密的值或只是把它们全部到SharedPreferences?如果需要加密,那么有效的方法是什么?

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

谢谢。

回答

2

当然,你应该加密用户设置,如登录,密码或电子邮件。我更喜欢SharedPreferences用于存储,并且在安全性方面它是足够的。

我发现在计算器上这两方法,这很公平:

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); 
    } 
} 

找不到链接,如果我发现,我将修改我的答案。

编辑:我找到了源代码,你可以看看关于here的所有讨论。

+3

当然,将密钥存储在应用程序中,并使用DES进行加密只会停止随意窥探。它在股票设备上并没有真正实现,因为共享首选项对于应用程序来说都是私有的。 – 2012-07-25 07:00:23

+0

我认为这是我所要求的。很好,谢谢。 – 2012-07-25 07:12:19

3

加密很简单,但真正的问题是用什么键?如果您对应用程序中的密钥进行硬编码,或者从某些已知值中派生出来,那么有权访问该设备的任何人都可以轻松解密这些值。你实现的只是混淆。由于Android没有系统密钥库的公共API,因此如果您需要保存实际的密码,则无法执行其他任何操作。除非您每次启动应用程序时都让用户输入密码,哪种方式会使目标失败。

如果你控制服务器和客户端,另一种方法是使用某种形式的基于令牌的认证,并且只能保存令牌。由于令牌可以过期并被撤销,因此获取令牌的人受到的损害远远小于暴露实际密码(可能也会在其他网站上使用)。

+0

谢谢,我明白你的意思了。 – 2012-07-25 07:08:09

+0

尼古拉,感谢您提供清晰详细的答案。我没有足够的时间用于基于令牌的身份验证。但很快我会按照您的指示更新系统。 – 2012-07-25 07:11:27