首页 文章

在.NET C中存储加密密钥的最佳方式#

提问于
浏览
58

在我们的应用程序中,我们有许多敏感的配置设置,我们将其存储在再次加密的xml文件中 .

必须在运行时解密此安全文件并读取配置值 . 但是出现了一个问题,密钥和初始化向量在代码中是硬编码的,因此任何人都可以使用Reflector读取它 .

在.NET中存储加密密钥的最佳方法是什么,所以没有人可以使用Reflector读取它们?

7 回答

  • 8

    如果您想保护您的数据免受其他用户的侵害 . 看看ProtectedData课程 .

    (免责声明:此答案不包括保护您的数据以创建复制保护方案) .

    此类使用Windows中的DPAPI来加密和解密用户或计算机级别的数据 .

    使用ProtectedData / DPAPI可以让您自己处理密钥和保护数据 . 您可以选择保护当前用户的数据 . 可以由相同的域用户从不同的计算机读取数据 .

    如果你想创建自己的密钥 . 您可以为每个用户/计算机创建密钥,并将此密钥存储在注册表中 . 由于可以保护注册表,因此只有当前用户才能读回密钥 . 我知道注册表有不好的业力,但实际上非常擅长存储这样的数据 .

    PS:不要把IV放在你的代码中 . 每次创建一个新的IV,并将其放在数据前面 .

  • 19

    如果您无法在反射器中读取它们,您希望程序如何读取它们?您可以通过分解它们并将部件存储在整个地方来对它们进行模糊处理,但是(AFAIK)一旦您要求程序能够读取它们,那么任何有权访问您的代码的人也可以阅读它们 .

    不要忘记内存中的值也可以访问(咳嗽SecureString) .

  • 4

    您应该使用Machine Keystore,它是一个安全的存储,特别是为此目的 . 例如:

    CspParameters cspParams = new CspParameters(PROV_RSA_FULL, null, KEYNAME);
    
    cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
    
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams);
    

    KEYNAME是一个自定义字符串,可用于稍后检索密钥 .

    有关更多示例,请参阅此问题:How to store a public key in a machine-level RSA key container

  • 1

    通常,应为每个会话创建一个新密钥和IV,并且不应存储密钥和IV以便在以后的会话中使用 .

    要将对称密钥和IV传送给远程方,通常使用非对称加密来加密对称密钥和IV . 在不加密的情况下在不安全的网络上发送这些值是非常不安全的,因为任何截获这些值的人都可以解密您的数据 . 有关加密和传输密钥和IV的过程的更多信息,请参阅Creating a Cryptographic Scheme .

  • 3

    安装应用程序时,请创建一组新的RSA密钥,然后使用私钥作为密码使用AES加密数据 . 由于Windows将RSA私钥安全地存储在创建它们的PC上,因此数据只能由数据解密 created 数据,因为只有该计算机才具有必要的密钥 .

  • 10

    如何将文件加密/解密密钥存储在远程服务器上,通过Web服务将其通过https传输到应用程序?这样,密钥留在计算机的内存中,但不是源代码文件 .

    这需要通过运行应用程序的任何人与密钥服务器 Build 连接 .

  • 0

    如何将密钥存储在硬件上,这里我说的是硬件安全模块!我们可以将它作为隐藏密钥的最佳实践吗?我们可以将密钥存储在配置文件中,然后加密配置文件吗?就我而言,我说的是一个独立的.Net应用程序 .

相关问题