1

随着时间的推移,像许多其他人一样,我在维护的系统中遇到了加密问题。

进程 A 生成一些加密文本,稍后进程 B 必须对其进行解码。他们为此共享相同的代码,如下所示:

public class DesEncryption {
private Cipher mEcipher;
private Cipher mDcipher;

private byte[] salt = {
        (byte) 0x08, (byte) 0x90, (byte) 0xA6, (byte) 0x4B,
        (byte) 0xBB, (byte) 0x51, (byte) 0x3C, (byte) 0xDE
};

// Iteration count
int iterationCount = 19;

DesEncryption(String passPhrase) throws EncryptionException {
    try {
        // Create the key
        KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
        SecretKey key = SecretKeyFactory.getInstance(
                "PBEWithMD5AndDES").generateSecret(keySpec);
        mEcipher = Cipher.getInstance(key.getAlgorithm());
        mDcipher = Cipher.getInstance(key.getAlgorithm());

        // Prepare the parameter to the ciphers
        AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);

        // Create the ciphers
        mEcipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
        mDcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
    } catch (java.security.InvalidAlgorithmParameterException e) {
        throw new EncryptionException(e);
    } catch (java.security.spec.InvalidKeySpecException e) {
        throw new EncryptionException(e);
    } catch (javax.crypto.NoSuchPaddingException e) {
        throw new EncryptionException(e);
    } catch (java.security.NoSuchAlgorithmException e) {
        throw new EncryptionException(e);
    } catch (java.security.InvalidKeyException e) {
        throw new EncryptionException(e);
    }
}

public String encrypt(String str) throws EncryptionException {
    try {
        // Encode the string into bytes using utf-8
        byte[] utf8 = str.getBytes("UTF8");

        // Encrypt
        byte[] enc = mEcipher.doFinal(utf8);

        // Encode bytes to base64 to get a string
        return new sun.misc.BASE64Encoder().encode(enc);
    } catch (javax.crypto.BadPaddingException e) {
        throw new EncryptionException(e);
    } catch (IllegalBlockSizeException e) {
        throw new EncryptionException(e);
    } catch (UnsupportedEncodingException e) {
        throw new EncryptionException(e);
    } catch (java.io.IOException e) {
        throw new EncryptionException(e);
    }
}

public String decrypt(String str) throws EncryptionException {
    try {
        // Decode base64 to get bytes
        byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);

        // Decrypt
        byte[] utf8 = mDcipher.doFinal(dec);

        // Decode using utf-8
        return new String(utf8, "UTF8");
    } catch (javax.crypto.BadPaddingException e) {
        throw new EncryptionException(e);
    } catch (IllegalBlockSizeException e) {
        throw new EncryptionException(e);
    } catch (UnsupportedEncodingException e) {
        throw new EncryptionException(e);
    } catch (java.io.IOException e) {
        throw new EncryptionException(e);
    }
}
}

这两个进程在不同的服务器上运行,都是 Centos(进程 A 为 5.3,进程 B 为 6.4)

进程 A 没有明显的问题 - 要编码的字符串如此可靠地完成。

当进程 B 开始时,一切似乎都很好。它正确解码和解密所需的字符串。

然而,在大约 24 小时的某个时间点,这将停止工作。在这一点上,我得到了 'BadPaddingException "Given final block not proper padding"' 异常。然后,每次使用任何编码字符串执行代码时都会继续这种情况,直到进程重新启动,此时一切都恢复正常,包括解码之前失败的字符串。

在出现问题时,调用 decrypt(encrypt("test")) 也会失败,因此这似乎与实际加密值无关,更多地与加密和解密不同步有关。

如果有人可以就我可能在哪里出错提供任何建议,我将不胜感激。

提前谢谢了...

安德鲁

4

0 回答 0