如何使用ASP.NET成员安全地存储服务密码?

时间:2011-12-03 20:26:41

标签: asp.net asp.net-mvc-3

我使用ASP.NET MVC 3会员资格为我的网站默认。因此,用户的会员密码被安全存储。

我的服务要求用户输入他们使用的其他网络服务的用户名/密码。我从我的服务中访问这些服务。如果我保存用户的服务密码,我需要确保安全地存储这些用户名/密码,这样如果有人攻击我的服务器,他们将不会被曝光。

我理解如何完成此操作的一般概念(使用他们提供的ASP.NET成员资格的哈希作为密钥加密用户名/ pw)。但我不知道具体的API或正确的模式。

我也认为真的这样做基本上是不可能的,因为如果有人破解我的服务,他们可以简单地使用哈希来解密密码。我是对的。

假设我错了,可以做我想做的事,假设我的模型包含这样的东西:

    public class MSExchangeSettings
    {
        [Required]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "Email address for your Exchange account")]
        public string EmailAddress { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "Password for your Exchange account")]
        public string Password { get; set; }

        ...
    }

有人可以提供一个如何正确执行此操作的示例吗?

如果,这是不可能的,我将不得不每次都要求用户提供PW,我想避免。当然,对于我使用支持OpenID或OAuth的服务,我还有其他选择,但对于这个特定的例子(Exchange),我需要一个用户名/ pw。

1 个答案:

答案 0 :(得分:-2)

看看这个

private static string GetPasswordHashed(string password) {

        var saltBytes = new byte[0x10];
        using (var random = new RNGCryptoServiceProvider()) {
            random.GetBytes(saltBytes);
        }

        var passwordBytes = Encoding.Unicode.GetBytes(password);

        var combinedBytes = saltBytes.Concat(passwordBytes).ToArray();

        byte[] hashBytes;
        using (var hashAlgorithm = HashAlgorithm.Create("HashAlgorithm")) {
            hashBytes = hashAlgorithm.ComputeHash(combinedBytes);
        }

        var PasswordHashed = Convert.ToBase64String(hashBytes);
        return PasswordHashed;
    }