加密密钥存储在哪里?

时间:2012-06-01 13:47:13

标签: asp.net security cryptography encryption-asymmetric

我是密码学的新手。我读过对称和非对称算法分别使用一个和两个加密密钥。并且这些密钥必须存放在安全的地方。但当我在网上搜索有关如何在asp.net中进行加密的教程时,我发现了一些奇怪的东西!例如this tutorial

加密或解密数据时,没有存储或提供的公钥或私钥!我无法理解。

我遇到的另一个问题是,到目前为止我发现的所有教程都是代码,没有任何解释这些代码是什么以及使用的原因。我很感激任何好的教程。

1 个答案:

答案 0 :(得分:5)

来自RSACryptoServiceProvider Constructor

  

如果未找到默认密钥,则会创建一个新密钥。

     

此构造函数创建一个适合加密会话密钥的Exchange密钥对,以便可以安全地存储和与其他用户交换。生成的密钥对应于使用非托管Microsoft Cryptographic API(CAPI)中使用的AT_KEYEXCHANGE值生成的密钥。

所以它只是生成一个新的密钥对,如果它找不到已经创建的密钥对;除了基于会话的数据之外,你不应该使用它。

一点背景(我假设您使用的是Windows),非对称密钥对与证书相关联。这些证书是您用来信任非对称密钥的证书。每个证书都可以由证书颁发机构(发出非对称密钥的权限)签名,如果您信任证书颁发机构,则您信任属于该机构签署的证书的非对称密钥。所有这些证书都存储在“证书存储”中,即“密钥存储”(Java),“密钥环”(Mac)。

您可以通过Start > Run > certmgr.msc查看证书。您的证书属于个人>证书。如果您打开一个,然后转到Certificate Path选项卡,您将看到证书链到证书颁发机构。如果在您的Trusted Root Certification Authorities > Certificates商店中找到属于证书颁发机构的“根”证书,则证书将被视为有效且受信任。

如果要为用户加密某些内容,则应进入其证书存储区,并提取其加密证书。为此,您应该打开“当前用户”密钥存储区,并遍历其中的所有证书,并选择密钥用法为“密钥加密”的密钥存储区,如果不止一个,请询问用户哪个他想用。

如果要使用服务帐户加密某些内容(例如,如果您是Web服务器),则应使用“本地计算机”密钥存储区中的证书,并仅授予您的服务帐户对相关私钥的读取权限使用您要使用的证书。

这可以使用X509Store Class完成,例如:

X509Store certificateStore = new X509Store("MY", StoreLocation.CurrentUser);
X509Certificate2Collection allCertificates = certificateStore.Certificates;
//Iterate through all certificates

“我的”代表个人证书,其余的可以找到here。 CurrentUser表示用户键,另一个选项是LocalMachine。

获得要使用的证书后,应使用公钥进行加密,使用私钥进行解密,并使用对称密钥。因此,如果您想要加密大量数据,那么您将要做的是:

  1. 获取证书
  2. 从证书中提取公钥
  3. 生成对称密钥(AES)
  4. 使用对称密钥加密数据
  5. 使用公钥加密对称密钥
  6. 使用加密数据存储加密的对称密钥,以及用于加密的证书的标识符(序列号)
  7. 当你解密时,你应该:

    1. 从加密数据中读取序列号
    2. 从密钥库中提取带有该序列号的证书
    3. 从该证书中提取私钥
    4. 使用该私钥解密对称密钥
    5. 使用该对称密钥解密数据
    6. 使用数据
    7. 我有一堆代码示例,如果您想看看,请告诉我您需要帮助的部分。

      这可能有点令人困惑,所以让我知道你想澄清什么。