使用PBKDF2WithHmacSHA1和的DESede / CBC / PKCS5Padding于Android 4.2及以上 [英] Using PBKDF2WithHmacSHA1 and DESede/CBC/PKCS5Padding for Android 4.2 and older

查看:1551
本文介绍了使用PBKDF2WithHmacSHA1和的DESede / CBC / PKCS5Padding于Android 4.2及以上的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的Andr​​oid应用程序,我想用的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆