gpt4 book ai didi

java - 从 android 调用时 TripleDES 算法会生成不同的结果

转载 作者:行者123 更新时间:2023-12-02 08:10:17 25 4
gpt4 key购买 nike

我有一个简单的java Web应用程序,它是由apache wicket构建的。当我在网络应用程序中注册用户时,我使用三元组对他们输入的密码进行加密并将其保存到数据库中。在登录页面,当他们输入相同的密码时,我对其进行加密并将加密的密码传递到数据库,以检查它是否正确。

现在我正在构建一个具有相同登录功能的 Android 应用程序。

在android应用程序登录页面中,我使用相同的加密库来加密密码,并且在两个平台上使用相同的 key 和初始化 vector ,但是如果我尝试在android中输入相同的密码字符串,TripleDes算法会生成完全不同的加密内容密码(更长)。因此从 Android 设备登录失败。我还注意到android生成的加密密码无法解密,它会抛出异常。

我认为两个平台之间可能存在字符串编码问题差异,但无法找出原因以及如何修复它。

这是我使用的算法:

public class TripleDES {
private String key;
private byte[] initializationVector;

public TripleDES(String key, byte[] initializationVector)
{
this.key = key;
this.initializationVector = initializationVector;
}

public String encryptText(String plainText) throws Exception{
//---- Use specified 3DES key and IV from other source -------------------------
byte[] plaintext = plainText.getBytes();
byte[] tdesKeyData = key.getBytes();

System.out.println("plain text length: " + plaintext.length);
System.out.println("key length: " + tdesKeyData.length);


Cipher c3des = Cipher.getInstance("DESede/CBC/PKCS5Padding");
SecretKeySpec myKey = new SecretKeySpec(tdesKeyData, "DESede");
IvParameterSpec ivspec = new IvParameterSpec(initializationVector);

c3des.init(Cipher.ENCRYPT_MODE, myKey, ivspec);
byte[] cipherText = c3des.doFinal(plaintext);

return Base64Coder.encodeString(new String(cipherText));
}

public String decryptText(String encryptedText) throws Exception{
//---- Use specified 3DES key and IV from other source -------------------
byte[] enctext = Base64Coder.decode(encryptedText);
byte[] tdesKeyData = key.getBytes();


Cipher c3des = Cipher.getInstance("DESede/CBC/PKCS5Padding");
SecretKeySpec myKey = new SecretKeySpec(tdesKeyData, "DESede");
IvParameterSpec ivspec = new IvParameterSpec(initializationVector);

c3des.init(Cipher.DECRYPT_MODE, myKey, ivspec);
byte[] cipherText = c3des.doFinal(enctext);
return new String(cipherText);
}

}

最佳答案

(编辑:如上所述,可逆地存储密码一开始就是一个坏主意,但为了使加密部分正确......)

这是第一期:

byte[] plaintext = plainText.getBytes();
byte[] tdesKeyData = key.getBytes();

这是使用默认的系统字符编码。所有安卓手机都一样吗?我不知道。 Android 中的内容与 Web 服务器上的内容相同吗?我不知道。如果一个平台使用 UTF-16,另一个平台使用 UTF-8,并且 plainText 都是 ASCII,那么这肯定会导致加密数据大小存在两倍的差异。

我建议始终指定编码 - 在许多情况下“UTF-8”是一个不错的选择。

编辑:好的,看起来问题也出在您稍后使用 cipherText 所做的事情上。您需要将原始字节转换为base64字符串。 Android 内置了一个 Base64 编码器,但是 this public domain code应该可以正常工作。而不是这一行:

return Base64Coder.encodeString(new String(cipherText));

你会使用

return Base64.encodeBytes(cipherText);

关于java - 从 android 调用时 TripleDES 算法会生成不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7572793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com