Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 储存IV和Rijndael的钥匙_C#_Encryption_Key_Store_Rijndael - Fatal编程技术网

C# 储存IV和Rijndael的钥匙

C# 储存IV和Rijndael的钥匙,c#,encryption,key,store,rijndael,C#,Encryption,Key,Store,Rijndael,我需要在app.config中存储用户名和密码。我想用Rijndael算法加密这些值。我在哪里存储解密un和pw的密钥和IV?我需要将应用程序部署到具有不同用户的不同服务器上。肯定不会存储在程序集中-相对简单地看一下IL可能会泄露秘密。即使是破坏它,也不会提供额外的安全性 最简单的方法是在不同服务器上本地使用OS\文件系统安全性来控制对密钥文件的读取访问。理想情况下,在文本文件上,该文件位于无法通过web访问的位置,只能通过具有严格权限的本地文件系统访问 如果需要分发应用程序,可以使用以下结构

我需要在app.config中存储用户名和密码。我想用Rijndael算法加密这些值。我在哪里存储解密un和pw的密钥和IV?我需要将应用程序部署到具有不同用户的不同服务器上。

肯定不会存储在程序集中-相对简单地看一下IL可能会泄露秘密。即使是破坏它,也不会提供额外的安全性


最简单的方法是在不同服务器上本地使用OS\文件系统安全性来控制对密钥文件的读取访问。

理想情况下,在文本文件上,该文件位于无法通过web访问的位置,只能通过具有严格权限的本地文件系统访问

如果需要分发应用程序,可以使用以下结构

  • C:\MyApp
    获取密钥和其他私人信息
  • 虚拟目录的
    C:\MyApp\www

这将防止窥探者(或Web服务器bug)访问数据。只有对机器的物理访问可能会泄露它,这通常可以更好地控制。

加密web.config或app.config文件通常使用RSA或DPAPI加密

我不确定它是否适合您的情况,只有当应用程序的用户受到限制而不是管理员时,它才有效


使用机器密钥加密如何?(据我所知)没有简单的方法可以做到这一点,但是您可以使用反射来侵入框架。机器钥匙未存储或仅部分存储在机器上。如果将ASP.NET配置为“为每个应用程序生成唯一密钥”,则应用程序的路径将用于派生密钥

代码如下所示:

private static MethodInfo _cookieEncryptMethod;
private static MethodInfo _cookieDecryptMethod;

public static string MachineKeyEncrypt(string data)
{
    if (_cookieEncryptMethod == null)
    {
        _cookieEncryptMethod = Type.GetType("System.Web.Security.CookieProtectionHelper").GetMethod("Encode", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod);
    }

    var dataBytes = Encoding.UTF8.GetBytes(data);

    return (string) _cookieEncryptMethod.Invoke(null, new object[] { CookieProtection.All, dataBytes, dataBytes.Length });
}

public static string MachineKeyDecrypt(string source)
{
    if (_cookieDecryptMethod == null)
    {
        _cookieDecryptMethod = Type.GetType("System.Web.Security.CookieProtectionHelper").GetMethod("Decode", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod);
    }

    var data = (byte[]) _cookieDecryptMethod.Invoke(null, new object[] { CookieProtection.All, source });

    return Encoding.UTF8.GetString(data);
}

@真的吗?比如什么?DPAPI可能是不使用硬件设备就可以做到的最好的。RSA不会有帮助。您可以通过允许密钥可导出在多台服务器上使用RSA加密,但我认为这不是一个好的解决方案。