2

在应用程序中,我想存储敏感数据(可以任意大),以便以后可以用于研究。关键是我不希望数据不受保护地散布,所以我想在保存之前对其进行加密。

在另一台计算机上(在更可靠的环境中)我想稍后解密该数据。应该可以使用现成的工具进行解密,例如 OpenSSL。现在我的问题是:我该怎么做?

我已经知道抽象步骤:

  1. 一劳永逸地生成一个公钥/私钥对。
  2. byte[]使用公钥在 Java 中加密 a ,并将其存储在某处。
  3. 将加密数据复制到“更安全”的计算机。
  4. 使用简单的 OpenSSL 命令行解密保存的数据。

我现在缺少的是细节:

  • 我需要什么样的密钥对?
  • 我应该使用什么加密方案?(可能类似于“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 来做。

4

2 回答 2

1

我终于找到了我想要的东西。我刚刚被所有的术语弄糊涂了,比如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();
  }
}
于 2011-02-14T02:26:23.007 回答
0

您应该了解 SSL 是关于加密网络流量的。带有证书等的公钥系统有利于验证各方之间的信任。如果您需要保护您以后将使用的东西,您可能应该不将以前的概念混合到您的解决方案中。它使您的生活更轻松。

这个问题和它作为指针的公认答案为例。您可能应该做的是使用散列函数从密码生成密钥。然后,您将使用 AES 加密您的数据。稍后在安全位置,您将使用相同的密码生成实际密钥并解密数据。

于 2011-02-06T15:46:57.140 回答