0

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

4

4 回答 4

1

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

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

http://msdn.microsoft.com/en-us/library/ff647398.aspx

于 2010-06-27T20:39:20.000 回答
0

绝对不要存储在程序集中 - 相对简单地查看 IL 可能会放弃这个秘密。即使混淆它,也不会提供额外的安全性。

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

于 2010-06-27T20:32:59.633 回答
0

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

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

  • C:\MyApp用于密钥和其他私人信息
  • C:\MyApp\www对于虚拟目录

这将防止窥探(或网络服务器错误)访问数据。只有对机器的物理访问才能潜在地揭示它,并且通常可以更好地控制。

于 2010-06-27T20:33:00.087 回答
0

如何使用机器密钥加密来做到这一点?(据我所知)没有简单的方法可以做到这一点,但是您可以使用反射侵入框架。机器密钥要么不存储,要么仅部分存储在机器上。如果将 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);
}
于 2010-06-28T10:55:17.527 回答