- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一个稳定的代码库(我们认为),我们将文件流式传输到代码库中,对其进行加密,然后写入生成的加密文件。然后我们解密加密文件以确保该过程在整个循环中正常运行。
我们一直在使用 PBEWITHSHA1ANDDESEDE
并且它已经正常工作了大约一年,但我们注意到该算法被认为有风险/损坏。但是,我们尝试换用更好的算法,但现在内容无法解密且无法读取。根据我们发现的 Veracode 博客 here,我们换成的算法是 PBEWithHmacSHA512AndAES_128
.
如果我们不做其他代码更改,为什么切换到这个替代算法会导致文件不加密/解密整圈?我们可以做些什么来让它发挥作用?
下面是代码的重要(我认为)部分,带有注释/注释。
// defined outside the below method; this algorithm works:
private static String ALGORITHM = "PBEWITHSHA1ANDDESEDE";
// the new version, which fails:
//private static String ALGORITHM = "PBEWithHmacSHA512AndAES_128";
private static Cipher getCipher(int mode, String password) throws NoSuchAlgorithmException, InvalidKeySpecException,
NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException {
// Create secret key using password
PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(ALGORITHM);
SecretKey secretKey = secretKeyFactory.generateSecret(pbeKeySpec);
// Create the cipher
byte[] salt = new byte[SALT_SIZE];
salt = password.getBytes();
PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt, PBEPARAMETERSPEC_ITERATION_COUNT);
Cipher cipher = Cipher.getInstance(ALGORITHM);
// this original line causes crash with the new algorithm, reporting:
// Exception in thread "main" java.security.InvalidAlgorithmParameterException: Missing parameter type: IV expected
// solved as per this S.O. post:
// https://stackoverflow.com/questions/29215274/how-do-i-properly-use-the-pbewithhmacsha512andaes-256-algorithm
cipher.init(mode, secretKey, pbeParameterSpec);
// this new line causes the encryption/decryption to apparently fail, giving results that look like this:
// �0�.�����j�"��ۗP#o˾���IYc� �we����)�Tq(f�C���.��njDt�.pG��
//cipher.init(mode, secretKey, cipher.getParameters());
return cipher;
}
编辑:
我们目前使用PBEWITHSHA1ANDDESEDE进行加解密。我们要做的是切换,以便我们使用 PBEWithHmacSHA512AndAES_128 进行加密和解密。我们不希望使用 PBEWithHmacSHA512AndAES_128 解密使用 PBEWITHSHA1ANDDESEDE 加密的密文。
需要明确的是,这一切都发生在一个类中,并在沙盒中执行一次作为概念证明。我们只想得到 PBEWithHmacSHA512AndAES_128 算法进行加密,并立即解密单个非关键内容。我们只是想根据 Veracode 的建议替换 PBEWITHSHA1ANDDESEDE,但我们无法弄清楚为什么这不起作用。
应要求,这里是整个 PoC:
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
public class FileEncryption {
private static String PASSWORD = "fake-password-for-stack-overflow-post";
private static String SOURCE_PATH = "";
private static String SOURCE_FILE;
private static String ENCRYPTED_FILE;
private static String DECRYPTED_FILE;
private static String ALGORITHM = "PBEWithHmacSHA512AndAES_128";
private static int SALT_SIZE = 8;
private static int PBEPARAMETERSPEC_ITERATION_COUNT = 100;
public static void main(String[] args) throws Exception {
if(args.length != 1) {
System.out.println("Only accept a single variable, the path to input.txt.");
System.out.println("(output will go to same dir)");
return;
}
SOURCE_PATH = args[0];
System.out.println("Set path: " + SOURCE_PATH);
if( SOURCE_PATH.charAt(SOURCE_PATH.length()-1) != '/' ) {
SOURCE_PATH += '/';
}
SOURCE_FILE = SOURCE_PATH + "plainfile.txt";
ENCRYPTED_FILE = SOURCE_PATH + "plainfile.encrypted.txt";
DECRYPTED_FILE = SOURCE_PATH + "plainfile.decrypted.txt";
encryptContent(SOURCE_FILE, ENCRYPTED_FILE, PASSWORD);
decryptContent(ENCRYPTED_FILE, DECRYPTED_FILE, PASSWORD);
}
private static void encryptContent(String inputFile, String outputFile, String password) throws Exception {
Cipher cipher = getCipher(Cipher.ENCRYPT_MODE, password);
performReadWrite(inputFile, outputFile, cipher);
}
private static void decryptContent(String inputFile, String outputFile, String password) throws Exception {
Cipher cipher = getCipher(Cipher.DECRYPT_MODE, password);
performReadWrite(inputFile, outputFile, cipher);
performRead(inputFile, cipher);
}
private static void performReadWrite(String inputFile, String outputFile, Cipher cipher)
throws FileNotFoundException, IOException {
FileInputStream inFile = new FileInputStream(inputFile);
FileOutputStream outFile = new FileOutputStream(outputFile);
CipherOutputStream cos = new CipherOutputStream(outFile, cipher);
int c;
while ((c = inFile.read()) != -1)
{
cos.write(c);
}
cos.close();
cos = null;
inFile.close();
inFile = null;
}
private static void performRead(String inputFile, Cipher cipher)
throws FileNotFoundException, IOException {
FileInputStream inFile = new FileInputStream(inputFile);
ByteArrayOutputStream os = new ByteArrayOutputStream();
CipherOutputStream cos = new CipherOutputStream(os, cipher);
int c;
while ((c = inFile.read()) != -1)
{
cos.write(c);
}
cos.close();
cos = null;
inFile.close();
inFile = null;
// aClass.outputStreamMethod(os);
String aString = new String(os.toByteArray(),"UTF-8");
System.out.println(aString);
}
private static Cipher getCipher(int mode, String password) throws NoSuchAlgorithmException, InvalidKeySpecException,
NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException {
// Create secret key using password
PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(ALGORITHM);
SecretKey secretKey = secretKeyFactory.generateSecret(pbeKeySpec);
// Create the cipher
byte[] salt = new byte[SALT_SIZE];
salt = password.getBytes();
PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt, PBEPARAMETERSPEC_ITERATION_COUNT);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(mode, secretKey, cipher.getParameters());
return cipher;
}
}
最佳答案
好的,所以您使用算法 A 加密了一些数据,然后更改代码以使用算法 B,现在您正在尝试解密使用算法 A 加密的密文,对吗?为什么你认为这行得通?毕竟算法不同。
相反,您应该编写一些使用算法 A 解密现有密文并立即使用算法 B 对其进行加密的迁移代码。对所有密文运行迁移代码以获得一组干净的加密文件,然后使用算法 B 直到算法C 来了。
由于您正在更改代码,因此可以使其变得更好。
最好对您的密文进行身份验证,以便像 padding oracle attack 这样的攻击不可能。这可以通过 GCM 或 EAX 等身份验证模式或使用 encrypt-then-MAC 来完成。方案。
关于java - 在密码实例算法之间切换会使内容无法解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44640282/
我有一个 C# 应用程序调用 Java 网络服务来验证用户密码。我想让 C# 应用程序加密密码,然后让 Java Web 服务解密密码。我已经完成了 Java 端的代码(解密代码),但我无法找出 C#
我正在使用以下代码在使用 openssl 的 Windows 中使用 C 加密和解密二进制数据。如您所见,在这两个函数中,我都知道纯文本的大小。有什么方法可以在不知道纯文本大小的情况下解密消息? #i
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有一个非常恼人的问题,Java中使用RSA算法对字符串进行不可靠的加密和解密。它似乎只能在大约 35% 的时间内工作,而且我不明白为什么它有时能工作,有时却不能。这是我写的一些测试代码,试图验证加密
我已经设法编写了用于文件加密/解密的函数。但它非常慢,尤其是随着文件大小的增加。例如几MB长的音频/视频文件 我几乎浏览了所有帖子来改进它,并尝试更改算法。如果有任何更改可以帮助我提高性能,请帮助我。
我正在尝试让我的转置密码发挥作用。 每当我将加密方法得到的密文输入解密方法时,我应该得到原始的明文......但事实并非如此...... 我做错了什么? 感谢您的帮助! public String E
我正在使用密码来加密和解密消息: public String encrypt(String string) throws InvalidKeyException, IllegalBlockSizeEx
我有一个在 MySQL 中存储数据的 spring-mvc 堆栈。其中一些数据需要保护,所以我想我应该加密它。由于我以后可能需要使用这些数据(信用卡、SSN 等),所以我需要对其进行解密。我认为这排除
作为一名SEOER,都想了解百度算法,通过算法原理来找到捷径的优化方案,那么今天我把研究多年的百度算法原理解密给大家,可能不是最好的,但是我可以给大家保证,这些都是非常实际的。希望给SEOER带来一
我试图找到一种技术来加密和解密程序中的文件,而无需将密码硬编码到程序中,也无需向用户询问密码。 如果我也可以从我正在编写的另一个程序中解密文件,那就太好了。 到目前为止,我还没有多少运气找到一种看起来
有没有一种方法可以使用作为字符串参数传递给程序的私钥而不是使用存储在机器上的证书来解密 PowerShell 中的 RSA?欢迎任何帮助,我的代码如下。 Function Decrypt-Asymme
通过问题Is it possible to use the Grails Jasypt plugin outside the GORM layer for simple String encrypti
我需要解密/加密我的域类中的几列,并且正在寻找有关如何做的信息。我已经找到了jasypt加密插件,但不幸的是它似乎与Grails 2.4不兼容。 我可能可以将一些东西拼凑在一起,但是想要确保Im遵循最
我需要有关声音文件加密/解密的帮助。我想在存储这个声音文件时加密一个声音文件,并在播放这个文件时解密它。我阅读了有关 java 中的加密/解密以及 java 中可用于此的大量示例代码。但这些程序不适用
我很感兴趣是否可以使用 Excel Visual Basic 和某些加密服务提供程序进行字符串加密/解密。 我找到了一个演练 Encrypting and Decrypting Strings in
我们正在使用加密/解密和UIIMAGE。如果我们在不保存到iphone画廊的情况下进行加密和解密以及UIIMAge,则可以正常工作,但是,如果我们进行加密,保存到画廊,将(加密的图像)加载到应用程序中
我正在做一个像这样的简单程序: package rsaexample; import java.io.*; import java.math.BigInteger; import java.secur
我发现这段代码返回给定字符串的校验和。 public static String getChecksum(String md5) { int counter = 0; while (c
我在 Java SE 和 Android 项目上使用相同的代码。在 Java 和 Android 中运行的应用程序连接到相同的 MQTT 代理并交换消息。消息使用 AES 进行加密/解密。我对 Jav
我想在 openssl/libcrypto 中使用 RSA 加密/解密一个长文件(我知道 AES 更好,但这只是为了比较)。我将输入文件分成大小为 numBlocks = inputFileLengt
我是一名优秀的程序员,十分优秀!