2015-02-05 44 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

相關問題