Я хочу зашифровать поток и затем отправить его с помощью Amazon S3. Я использую устаревший код и имею два важных параметра: незашифрованный InputStream
и его длину. Это важно, так как AmazonS3Client хочет знать длину потока, прежде чем загружать его.
Шифрование потока не очень сложная задача:
InputStream in = new FileInputStream("path-to-file");
KeyGenerator keygen = KeyGenerator.getInstance("AES");
Key key = keygen.generateKey();
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, key);
OutputStream encryptedStream = new ByteArrayOutputStream();
CipherOutputStream out = new CipherOutputStream(encryptedStream, cipher);
out.write(in.read());
out.flush();
byte[] bytes = ((ByteArrayOutputStream) encryptedStream).toByteArray();
InputStream encryptedInput = new ByteArrayInputStream(bytes);
Однако этот подход можно использовать только для небольших файлов, поскольку они записываются в байтовый массив, хранящийся в памяти. Дело в том, что я хотел бы зашифровать большие файлы (> 1 ТБ). Как мне это сделать? Более конкретно, я получаю InputStream, и моя задача - вернуть зашифрованный InputStream, который будет использоваться Amazon S3.