我使用aes-cbc-pkcs5padding来编码密码,下面的代码适用于android4.4或更高版本,但在android4.2中,它每次都会返回不同的结果。谁能教我如何解决这个问题?谢谢。
public String encryptPass(){
String username="stackoverflow";
String password="stackoverflow";
String salt="stackoverflow145";
/* generate secretkey */
PBEKeySpec keySpec=new PBEKeySpec(username.toCharArray(),salt.getBytes(),1000,256);
SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
SecretKey key=keyFactory.generateSecret(keySpec);
/* IV bytes 16 length */
byte[] iv={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
IvParameterSpec ivSpec=new IvParameterSpec(iv);
Cipher cipher=Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE,key,ivSpec);
byte[] passBytes=cipher.doFinal(password.getBytes());
String result=Base64.encodeToString(passBytes,Base64.NO_WRAP);
return result;
}
我尝试添加代码:cipher.getProvier.getName()进行测试,然后我发现在android4.4或更高版本中,它显示" AndroidOpenSSL&#34 ;;低于4.4,它是" BC"。这个问题有关系吗?有人能帮助我吗?感谢。
答案 0 :(得分:0)
最后,我将secretKey转换为secretKeySpec,它适用于所有Android版本。代码如下:
/* generate secretkey */
PBEKeySpec keySpec=new PBEKeySpec(username.toCharArray(),salt.getBytes(),1000,256);
SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
SecretKey tmp=keyFactory.generateSecret(keySpec);
/*transform key to keySpec*/
SecretKey key=new SecretKeySpec(tmp.getEncoded(),"AES");
可能有人告诉我为什么?我测试改变算法" AES"与" DES",但最后结果没有改变。那就是我们的。