首页
社区
课程
招聘
保存一个字符串密钥,有什么好方法
发表于: 2016-4-26 17:20 6396

保存一个字符串密钥,有什么好方法

2016-4-26 17:20
6396

采用https通信,app需要保存证书的密钥信息,请问这个密钥怎么保存安全,有什么好的方法

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 53
活跃值: (321)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
AndroidKeystore
比app自己保存要好N倍
2016-4-26 17:57
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
加密算法如rsa xxtea等 加密方式 so,插入混淆代码,加固
2016-4-30 23:10
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
能说的详细点么
2016-5-3 13:44
0
雪    币: 272
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
随便百度搜下就出来了,没用过,仅当参考

以下内容转载自:
9acK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3q4H3M7s2y4U0j5h3&6Q4x3X3f1K6y4U0m8Q4x3X3g2U0L8W2)9J5c8X3u0D9L8$3N6Q4x3V1k6Q4x3@1k6H3i4K6y4p5x3e0b7#2

方案1:
Android里存储加密密钥最好的解决方案应该是使用keystore。
0bdK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3c8W2N6X3g2D9L8%4m8W2M7W2)9J5k6h3q4F1k6s2u0G2K9h3c8Q4x3X3g2U0L8$3#2Q4x3V1k6J5k6h3k6W2M7X3g2F1j5$3g2Q4x3V1k6B7j5i4k6S2i4K6u0r3M7$3g2U0N6i4u0A6N6s2W2Q4x3V1k6w2k6i4W2e0N6r3!0J5k6g2)9J5k6h3S2@1L8h3H3`.
条件:需要target SDK >= 18
特点:
1.只有应用自身UID可以访问这个KeyStore。
2.只能存储非对称密钥,也就是说你需要使用这个非对称密钥加密存储在设备上某处的对称密钥。

方案2:
如果target SDK < 18,有个相对来说比较安全的方案,因为Android4.3以前没有一个合适的存储对称密钥的系统方案。这时可以使用AccountManager。
c0bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3c8W2N6X3g2D9L8%4m8W2M7W2)9J5k6h3q4F1k6s2u0G2K9h3c8Q4x3X3g2U0L8$3#2Q4x3V1k6J5k6h3k6W2M7X3g2F1j5$3g2Q4x3V1k6S2L8X3c8J5L8$3W2V1i4K6u0r3j5h3y4U0L8%4g2F1N6s2y4Q4x3V1k6m8j5$3y4G2N6h3&6@1e0h3q4F1j5h3N6W2M7W2)9J5k6h3S2@1L8h3H3`.
特点:只允许添加这个密钥的应用访问它,当使用getPassword()方法时会校验调用者的uid以及其是否拥有 AUTHENTICATE_ACCOUNTS 这个权限。
Note:虽然拥有root权限的应用依然可以访问到这个密钥,然而却比和被加密的数据一起存储在应用私有目录安全。

方案3:(针对使用了应用锁、文件锁等功能,需要用户输入密码才能访问的功能)
存储密钥最安全的方式,无疑是存储在用户的脑子里。对于一些特殊功能的应用,比如文件锁、应用锁等,可以使用PBKDF2函数,把用户输入的密码做为参数来生成加密密钥。如果用户的密码足够复杂,那么这个方案应该是很安全的。谷歌实现了这个方案。
78aK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3q4F1k6s2u0G2K9h3c8Q4x3X3c8V1k6i4k6W2L8r3!0H3k6i4u0K6i4K6u0W2j5X3I4G2k6%4y4H3L8%4c8Q4x3X3g2U0L8$3#2Q4x3V1j5J5x3o6p5K6i4K6u0r3x3o6u0Q4x3V1k6#2M7$3W2F1k6#2)9J5k6r3y4J5P5i4m8@1L8$3N6J5j5i4m8Z5P5g2)9J5k6s2c8G2i4K6u0V1M7%4c8G2M7X3g2Q4x3X3c8U0M7X3g2V1k6h3&6@1K9h3q4D9M7#2)9J5k6h3S2@1L8h3H3`.
代码:
public static SecretKey generateKey(char[] passphraseOrPin, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException {
// Number of PBKDF2 hardening rounds to use. Larger values increase
// computation time. You should select a value that causes computation
// to take >100ms.
final int iterations = 1000;
// Generate a 256-bit key
final int outputKeyLength = 256;
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(“PBKDF2WithHmacSHA1″);
KeySpec keySpec = new PBEKeySpec(passphraseOrPin, salt, iterations, outputKeyLength);
SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
return secretKey;
}
Note:这个salt是一个随机的数,可以和需要加密的数据一块存储在应用私有目录。
关于SecureRandom的使用
Android 4.2之前使用的SecureRandom是由Bouncy Castle-based 实现的,4.2开始默认由OpenSSL提供。下面这段代码在4.2之前的系统上,调用secureRandom.nextInt()生成的数字是相同的,随机性被破坏。
SecureRandom secureRandom = new SecureRandom();
byte[] b = new byte[] { (byte) 1 };
secureRandom.setSeed(b);
// Prior to Android 4.2, the next line would always return the same number!
System.out.println(secureRandom.nextInt());
建议在使用SecureRandom时不要使用setSeed()来设置seed。
最安全的方案:97bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3q4F1k6s2u0G2K9h3c8Q4x3X3c8V1k6i4k6W2L8r3!0H3k6i4u0K6i4K6u0W2j5X3I4G2k6%4y4H3L8%4c8Q4x3X3g2U0L8#2)9J5k6i4g2C8i4K6u0r3x3U0l9I4x3#2)9J5c8U0l9^5i4K6u0r3M7$3!0E0k6g2)9J5k6s2y4W2j5%4g2J5k6i4u0S2L8X3c8G2L8g2)9J5k6s2c8Z5L8%4g2Y4K9s2c8K6i4K6u0W2K9s2c8E0L8l9`.`.

最后几点建议:
1.不要依赖系统的umask来生成文件的访问权限(不同系统版本umask不同),显式的使用MODE_PRIVATE
2.不要存储在sdcard上,sdcard为了兼容性使用的是fat32格式,即使使用MODE_PRIVATE来限制文件权限也是无用的。任何申请了读写sdcard权限的应用都可以访问sdcard上任何内容。
3.不要硬编码密钥到代码里。
2016-5-3 14:30
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这方法还是不行
2016-5-4 10:50
0
雪    币: 4
活跃值: (347)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
用白盒算法吧
2016-5-4 11:16
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不明白,请在描述下
2016-5-4 14:00
0
雪    币: 4
活跃值: (347)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
自己搜下 白盒加密算法
2016-5-12 16:59
0
游客
登录 | 注册 方可回帖
返回