2015-02-05 76 views
1

在我的Android应用程序中,我想使用DESede/CBC/PKCS5Padding加密密码,我的解决方案来自Lollipop(5.x),Android KitKat(4.4。 X)和Android果冻豆(版本4.3.x)使用PBKDF2WithHmacSHA1和DESede/CBC/PKCS5Padding for Android 4.2及更早版本

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

但它是行不通以下版本(4.2.x版及以下),这种加密的密码似乎对于为例随意改变:

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== 

特别是如何解决Android 4.2.x的这个问题?

我发现有了图书馆Bouncy Castle,但我没有找到如何实现'IV'(Generator Vector)。你有好主意吗 ?

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

回答

0

从Android 4.4开始,SecretKeyFactory API已更改。也许这可以帮助:

在Android 4.3及更早版本的平台,在javax.crypto.SecretKeyFactory实施PBKDF2WithHmacSHA1密钥生成算法只使用了Java字符的低8位的密码短语。在Android 4.4中,根据PCKS#5中的建议,该算法被更改为使用Unicode字符中的所有可用位。

这种变化可能会影响使用对称加密和满足下列条件的应用程序: 1.使用SecretKeyFactory生成对称密钥,并 2.使用PBKDF2WithHmacSHA1作为SecretKeyFactory他们的密钥生成算法,并 3。允许密码短语

这里原来的文章Unicode输入:

https://plus.google.com/+AndroidDevelopers/posts/fTY97ekzn6Z

这里你可以阅读有关更改SecretKeyFactory API:

http://android-developers.blogspot.it/2013/12/changes-to-secretkeyfactory-api-in.html

+0

谢谢你的帮助。最后,我的解决方案适用于Android 4.3.x,但不适用于Android 4.2.x及更低版本。我纠正了我的帖子。这个解决方案对我不起作用,这真的很奇怪......: - / – bzhWarrior 2015-02-06 10:32:26

相关问题