使用PBKDF2WithHmacSHA1和的DESede / CBC / PKCS5Padding于Android 4.2及以上 [英] Using PBKDF2WithHmacSHA1 and DESede/CBC/PKCS5Padding for Android 4.2 and older
问题描述
在我的Android应用程序,我想用的DESede / CBC / PKCS5Padding加密口令,我的解决方案从棒棒堂(5.x的)的作品,Android的奇巧(4.4.x到)和Android果冻豆(4.3.x版)
私有静态最终字符串键=A2 [..];
私有静态最后弦乐盐=T [..];
私有静态最后弦乐IV =U [..];
私有静态最后弦乐DES_EDE_PKCS5 =的DESede / CBC / PKCS5Padding公共静态加密字符串(字符串密码){
字节[] = byteSalt Base64.de code(SALT,Base64.DEFAULT);
字节[] = bytesIv Base64.de code(IV,Base64.DEFAULT);
串MDP =;
尝试{
SecretKeyFactory工厂= SecretKeyFactory.getInstance(PBKDF2WithHmacSHA1);
KeySpec规格=新PBEKeySpec(KEY.toCharArray(),byteSalt,NB_ITER_RFC,SIZE_KEY);
SecretKey的SecretKey的= factory.generateSecret(规范);
密码C = Cipher.getInstance(DES_EDE_PKCS5);
IvParameterSpec ivParam =新IvParameterSpec(bytesIv);
c.init(Cipher.ENCRYPT_MODE,SecretKey的,ivParam);
字节[] =加密c.doFinal(password.getBytes(UTF-8));
MDP = Base64.en codeToString(加密,Base64.DEFAULT);
}
赶上[..]
返回MDP;
}
但它下面的版本(4.2.x版及以下)不起作用,这个加密的密码似乎是为为例随意改变:
D /雄-Chiffrement-加密(10739):密码CHIFFRE = P7vWc + 7hFuUaWQghVeO + ZA ==
D /雄-Chiffrement-加密(10739):密码CHIFFRE = jGr6nlvnYLd / AK / d7nkUrA ==
D /雄-Chiffrement-加密(10739):密码CHIFFRE = I2weyEddIav7EulAiuQDbg ==
D /雄-Chiffrement-加密(10739):密码CHIFFRE = HF7OFpUXYuwOm81WekReDg ==
我怎样才能解决这个问题为Android 4.2.x版特别?
我发现,库充气城堡,但我没有找到如何实施'四'(传感器矢量)。你有一个想法?
PKCS5S2ParametersGenerator根=新PKCS5S2ParametersGenerator();
gen.init(PBEParametersGenerator.PKCS12PasswordToBytes(passCharArray),byteSalt,NB_ITER_RFC);
PARAMS KeyParameter的=(KeyParameter的)gen.generateDerivedParameters(SIZE_KEY);
字符串密码2 = Base64.en codeToString(params.getKey(),Base64.DEFAULT);
我测试过此解决方案:的 http://android-developers.blogspot.fr/2013/08/some-securerandom-thoughts.html
这是由于PRNG(伪随机数发生器),但这个解决方案没有效果...
公共类CustomApplication扩展应用{ @覆盖
公共无效的onCreate(){
PRNGFixes.apply(); [..]
}
}
In my Android application, I would like to encrypt passwords with DESede/CBC/PKCS5Padding, my solution works from Lollipop(5.x),Android KitKat(4.4.x) and Android Jelly Bean(4.3.x )
private static final String KEY = "a2[..]";
private static final String SALT = "t[..]";
private static final String IV = "u[..]";
private static final String DES_EDE_PKCS5 = "DESede/CBC/PKCS5Padding"
public static String encrypt(String password) {
byte[] byteSalt = Base64.decode(SALT, Base64.DEFAULT);
byte[] bytesIv = Base64.decode(IV, Base64.DEFAULT);
String mdp = "";
try {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(KEY.toCharArray(), byteSalt, NB_ITER_RFC, SIZE_KEY);
SecretKey secretKey = factory.generateSecret(spec);
Cipher c = Cipher.getInstance(DES_EDE_PKCS5);
IvParameterSpec ivParam = new IvParameterSpec(bytesIv);
c.init(Cipher.ENCRYPT_MODE, secretKey, ivParam);
byte[] encrypted = c.doFinal(password.getBytes("UTF-8"));
mdp = Base64.encodeToString(encrypted, Base64.DEFAULT);
}
catch [..]
return mdp;
}
But it's doesn't work for below version (4.2.x and below), this encrypted password seems to change randomly for exemple :
D/andro-Chiffrement-encrypt(10739): password chiffré = P7vWc+7hFuUaWQghVeO+zA==
D/andro-Chiffrement-encrypt(10739): password chiffré = jGr6nlvnYLd/AK/d7nkUrA==
D/andro-Chiffrement-encrypt(10739): password chiffré = I2weyEddIav7EulAiuQDbg==
D/andro-Chiffrement-encrypt(10739): password chiffré = HF7OFpUXYuwOm81WekReDg==
How can I solve this problem for Android 4.2.x especially ?
I found that with library Bouncy Castle, but I didn't found how to implement 'IV' (Generator Vector). Do you have an idea ?
PKCS5S2ParametersGenerator gen = new PKCS5S2ParametersGenerator();
gen.init(PBEParametersGenerator.PKCS12PasswordToBytes(passCharArray), byteSalt, NB_ITER_RFC);
KeyParameter params = (KeyParameter) gen.generateDerivedParameters(SIZE_KEY);
String password2 = Base64.encodeToString(params.getKey(), Base64.DEFAULT);
I've tested this solution : http://android-developers.blogspot.fr/2013/08/some-securerandom-thoughts.html
it's due to PRNG (Pseudo Random Number Generator)but this solution has no effect...
public class CustomApplication extends Application {
@Override
public void onCreate() {
PRNGFixes.apply(); [..]
}
}
这篇关于使用PBKDF2WithHmacSHA1和的DESede / CBC / PKCS5Padding于Android 4.2及以上的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!