Как безопасно хранить служебные пароли с помощью ASP.NET Membership? - PullRequest
4 голосов
/ 04 декабря 2011

Я использую членство ASP.NET MVC 3 для моего сайта со значениями по умолчанию.Таким образом, пароль участника для пользователя надежно хранится.

Мой сервис требует от пользователя ввода имени пользователя / паролей для других веб-сервисов, которые они используют.Я получаю доступ к этим услугам из своего сервиса.Если я сохраняю служебные пароли пользователей, мне нужно убедиться, что эти имена пользователей / пароли также надежно хранятся, чтобы, если кто-то взломает мой сервер, они не были раскрыты.

Я понимаю общие концепции того, как это можетбыть сделано (зашифруйте имя пользователя / pw, используя хэш членства 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 голосов
/ 04 декабря 2011

Взгляните на это

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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...