Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中加密会话值_Android_Encryption - Fatal编程技术网

如何在Android中加密会话值

如何在Android中加密会话值,android,encryption,Android,Encryption,我正在开发一个基于web服务器的Android应用程序。安装该应用程序的用户应该在web上注册,以便登录。当有人尝试登录时,我使用API验证他们的信息 所以我对持久化和加密过程非常好奇。我应该加密这些值还是将它们全部放在SharedReferences?如果需要加密,有效的方法是什么 最后但并非最不重要的一点是,就安全性而言,共享引用是否足够 谢谢。当然,你应该加密用户设置,如登录、密码或电子邮件。我更喜欢SharedReferences来存储,是的,就安全性而言,这就足够了 我在StackOv

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

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

最后但并非最不重要的一点是,就安全性而言,共享引用是否足够


谢谢。

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

我在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);
    }
}
找不到链接,如果找到,我将编辑我的答案


编辑:我找到了源代码,您可以查看所有讨论。

加密很容易,但真正的问题是什么密钥?如果您在应用程序中硬编码密钥,或者从某个已知值派生密钥,任何有权访问该设备的人都可以轻松解密这些值。你所取得的成就只不过是混淆而已。由于Android没有系统密钥库的公共API,如果您需要保存实际密码,那么就没有其他方法可以做了。当然,除非你让用户在每次启动应用程序时输入一个密码,否则这样做就达不到目的


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

当然,将密钥存储在应用程序中,并使用DES加密只会停止偶然的窥探。它在股票设备上并没有什么实际效果,因为共享pref对应用程序来说是私有的。谢谢你,我现在明白你的意思了。尼古拉,谢谢你清晰详细的回答。我没有足够的时间进行基于令牌的身份验证。但很快我会按照你的指示更新系统。