криптография с открытым ключом с использованием Java и OpenSSL - PullRequest
2 голосов
/ 06 февраля 2011

В приложении я хочу хранить конфиденциальные данные (которые могут быть произвольно большими), чтобы впоследствии их можно было использовать для исследования.Дело в том, что я не хочу, чтобы данные лежали без защиты, поэтому я хочу зашифровать их перед сохранением.

На другом компьютере (в более надежной среде) я хочу расшифровать эти данные позже.Расшифровка должна быть возможна с помощью легкодоступных инструментов, например OpenSSL.Теперь мой вопрос: как мне все это сделать?

Я уже знаю абстрактные шаги:

  1. Раз и навсегда сгенерируйте пару открытый / закрытый ключ.
  2. Зашифруйте byte[] в Java с помощью открытого ключа, сохраните его где-нибудь.
  3. Скопируйте зашифрованные данные на «более безопасный» компьютер.
  4. Расшифруйте сохраненные данные с помощью простой команды OpenSSLline.

Теперь мне не хватает деталей:

  • Какая пара ключей мне нужна?
  • Какую схему шифрования следует использовать?использовать?(это, вероятно, что-то вроде «rsa-шифровать симметричный ключ, а затем шифровать данные этим ключом»)
  • Как выглядит простая командная строка OpenSSL?

[Обновление 2011-02-13]

После небольшого исследования я нашел страницу, которая точно описывает, что я хочу сделать: http://blog.altudov.com/2010/09/27/using-openssl-for-asymmetric-encryption-of-backups/. В основном ответом на мой шаг 4 является эта командастрока:

openssl smime -decrypt \
  -in data.smime -binary -inform DER \
  -inkey key.pem \
  -out data

Теперь мой вопрос: как я могу сгенерировать файл из Java, формат которого совместим с OpenSSL, чтобы я мог распаковать его с помощью этой командной строки?Я хочу делать это сотнями раз в секунду, поэтому запуск внешнего процесса кажется слишком медленным.Вот почему я хочу сделать это прямо в Java.

Ответы [ 2 ]

1 голос
/ 14 февраля 2011

Я наконец нашел именно то, что искал.Меня просто смутили все термины, такие как S/MIME, ASN.1, DER и так далее.Но, наконец, и, казалось, по совпадению, я достиг пакета CMS (что бы это ни значило) от bouncycastle, который делает все, что я хочу.Так вот мой код:

package de.roland_illig.crypto;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.GeneralSecurityException;
import java.security.Security;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

import org.apache.commons.io.IOUtils;
import org.bouncycastle.cms.CMSEnvelopedDataStreamGenerator;
import org.bouncycastle.cms.CMSEnvelopedGenerator;
import org.bouncycastle.cms.CMSException;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class CryptDemo {

  private static final File DIR = new File("c:/program files/cygwin/home/roland/crypto/");

  private static X509Certificate certificate() throws IOException, GeneralSecurityException {
    InputStream is = new FileInputStream(new File(DIR, "key.pub.der"));
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    X509Certificate cert = (X509Certificate) cf.generateCertificate(is);
    is.close();
    return cert;
  }

  private static void encrypt() throws IOException, GeneralSecurityException, CMSException {
    CMSEnvelopedDataStreamGenerator gen = new CMSEnvelopedDataStreamGenerator();
    gen.addKeyTransRecipient(certificate());

    InputStream is = new FileInputStream(new File(DIR, "secret"));
    OutputStream out = new FileOutputStream(new File(DIR, "secret.encrypted"));
    OutputStream encryptingOut = gen.open(out, CMSEnvelopedGenerator.AES128_CBC, "BC");

    IOUtils.copy(is, encryptingOut);

    is.close();
    encryptingOut.close();
    out.close();
  }

  public static void main(String[] args) throws Exception {
    Security.addProvider(new BouncyCastleProvider());

    encrypt();
  }
}
0 голосов
/ 06 февраля 2011

Вы должны понимать, что SSL - это шифрование сетевого трафика. Системы открытых ключей с сертификатами и т. Д. Хороши для проверки доверия между сторонами. Если вам нужно защитить что-то, что вы будете использовать позже, вы, вероятно, должны пойти дальше, не смешивая предыдущие концепции в своем решении. Это делает вашу жизнь проще.

Возьмем, к примеру, этот вопрос и принятый ответ на него в качестве указателя. Вероятно, вам следует использовать хеш-функцию для генерации ключа из пароля. Тогда вы бы зашифровали свои данные с помощью AES. Позже в безопасном месте вы будете использовать тот же пароль для генерации фактического ключа и расшифровки данных.

...