加密密钥存储在哪里?

moh*_*sti 3 asp.net security cryptography encryption-asymmetric

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

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

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

Pet*_*y B 5

来自RSACryptoServiceProvider构造函数:

如果未找到默认密钥,则会创建新密钥.

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

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

 

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

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

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

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

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

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

"我的"代表个人证书,其余的可以在这里找到.CurrentUser表示用户键,另一个选项是LocalMachine.

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

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

解密时你应该:

  1. 从加密数据中读取序列号
  2. 从密钥库中提取带有该序列号的证书
  3. 从该证书中提取私钥
  4. 使用该私钥解密对称密钥
  5. 使用该对称密钥解密数据
  6. 使用数据

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

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

  • @reza当您同步一个RSACryptoServiceProvider对象而不指定键时,它将生成一次性密钥,在会话完成后(对象处理)不会存储在任何地方.我不确定任何好的在线教程,但我可能有一些东西.您希望加密哪种数据? (3认同)
  • @reza,没有服务器访问权限,你唯一的选择就是让用户指定一个你从中获取密钥的密码(SHA-256密码,用户名为盐,并使用该哈希值作为AES 256密钥) .虽然如果他们忘记密码,他们的数据将会消失.如果你想要一个正确的加密设置,你真的需要你自己的,安全的服务器. (2认同)
  • 或者你可以自己生成密钥,并为他们提供一个密钥文件,只要他们登录就必须上传/输入密钥文件. (2认同)