2011-02-06 100 views
2

在一个应用程序中,我想存储敏感数据(可以是任意大的),以便稍后用于研究。问题是我不希望数据存在于未受保护的位置,所以我想在保存之前对其进行加密。使用Java和OpenSSL进行公钥加密

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

我已经知道了抽象步骤:

  1. 一劳永逸生成公钥/私钥对。
  2. 使用公钥在Java中加密byte[],将其存储在某处。
  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来做的原因。

回答

1

我终于找到了我正在寻找的东西。我刚刚被S/MIME,ASN.1,DER等所有术语所困惑。但最后,似乎是巧合,我达到了来自bouncycastle的CMS(无论是什么意思),它完成了我想要的任何事情。所以这里是我的代码:

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

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

this question and the accepted answer it has作为指针。你可能应该做的是使用散列函数从密码生成密钥。然后你会使用AES加密你的数据。稍后在安全的位置,您将使用相同的密码来生成实际密钥并解密数据。

+0

我想我已经理解了所有的概念。我只想要一种加密格式,可以通过大多数机器上已安装的工具轻松理解,而不是为加密数据片段增加自己的文件格式。 – 2011-02-13 21:36:46

+0

@Roland在这种情况下,像http://bsdsupport.org/2007/01/q-how-do-i-use-openssl-to-encrypt-files/将做:) – erloewe 2011-02-13 21:49:33

相关问题