2012-06-01 84 views
3

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

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

我的另一个问题是,我发现的所有教程直到现在只是代码没有任何解释这些代码是什么以及为什么使用。我很欣赏任何好的教程建议。

回答

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 

“MY” 代表个人证书,其余的都可以找到here。 CurrentUser代表用户密钥,另一个选项是LocalMachine。

一旦您拥有要使用的证书,您应该使用公钥加密,并使用私钥解密,并配合使用对称密钥。所以,如果你有一个大的数据集,你想加密,你会做的是:

  1. 获取证书
  2. 拉离证书
  3. 生成对称密钥(AES)
  4. 对数据进行加密的公钥使用对称密钥
  5. 使用公钥加密对称密钥
  6. 存储使用加密数据的加密对称密钥以及用于加密的证书的标识符(序列号)

当你解密你应该:

  1. 阅读从加密的数据
  2. 拉证书,从密钥存储,与序列号
  3. 序列号拉私钥出该证书的
  4. 使用该私钥解密对称密钥
  5. 使用该对称密钥解密数据
  6. 使用da ta

我有一堆代码示例,如果您想查看一下,请告诉我您需要帮助的部分。

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

+1

谢谢你,很好的解释,回答了我的问题。但是你的意思是“你不应该使用这个以外的基于会话的数据。” ?不使用新的密钥或RSACryptoServiceProvider本身?你可以建议任何好的教程,并在密码学的详细解释在asp.net?我真的需要一个真实的世界,而不是一个在控制台主要功能中都可以完成的示例。 –

+3

@reza当你在没有指定键的情况下对一个RSACryptoServiceProvider对象进行实例化时,它会生成一次性的键,在会话完成后(对象被放置),这些键不会被存储在任何地方。我不确定任何优秀的在线教程,但我可能会有一些东西。你想要加密哪种数据? –

+1

我想加密用户个人数据,除了用户自己以外,任何人都不应该看到这些数据。这是一个共享主机。没有访问服务器。无法加密数据库服务器中的数据。不知道在哪里保存私钥。但我知道我想使用对称加密使用AES算法,因为加密和解密都在同一个应用程序中完成 –