【转载请注明出处】
笔者:DrkCore (http://blog.youkuaiyun.com/DrkCore)
原文链接:(http://blog.youkuaiyun.com/drkcore/article/details/69931654)
问题描述
笔者偶尔会写一些自己的小应用,其中有个功能就是九宫格应用锁。通常情况下我们是用数字来标志九宫格的解锁顺序,并将该顺序组成字符串加密了放在 SharedPreferences 中的。一切都很正常,直到笔者将项目的 targetSdkVersion 设置为了 25 后程序崩溃了:
********** PLEASE READ ************
*
* New versions of the Android SDK no longer support the Crypto provider.
* If your app was relying on setSeed() to derive keys from strings, you
* should switch to using SecretKeySpec to load raw key bytes directly OR
* use a real key derivation function (KDF). See advice here :
*
http://android-developers.blogspot.com/2016/06/security-crypto-provider-deprecated-in.html
***********************************
我们知道加密算法都是需要密钥的,比如 AES 算法支持128 比特、192 比特和 256 比特三种长度的密钥,通常这些密钥会被转化成字节数组明文写在代码中或者写入成 KeyStore 文件。如果你是直接使用这些密钥的话是不会有任何问题的,但是有的时候我们需要通过一个字符串格式的密码来生成密钥。
按照搜索引擎上找来的方法你可能会写出如下的代码,然后遇到和笔者一样的问题:
public static final String DEPREACATED_SECURE_ALGORITHM_SHA1PRNG = "SHA1PRNG";
public static final String DEPREACATED_SECURE_PROVIDER_CRYPTO = "Crypto";
/**
* 按照指定编码从字符串中生成指定长度的密钥 key。
*
* @param password
* @param charset
* @param keyBitLen
* @return
* @throws NoSuchProviderException
* @throws NoSuchAlgorithmException
*/
@Deprecated
public