SecureString представлен в виде байта [], вы можете закодировать байты, например. с битконвертером и сохраните результат. Кроме того, SecureString - это шифрование, а не хеш, поскольку его можно расшифровать. (увидеть ниже)
SecureString в основном предназначен для хранения конфиденциальных данных в памяти. Если у вас есть услуга / веб-сайт, это не так важно, как значения, которые хранятся в базе данных. Они никогда не должны быть открытым текстом, и imo не могут быть расшифрованы вашим или любым другим администратором. Также я не уверен, что другой сервер может расшифровать строки, поэтому у вас могут возникнуть проблемы, когда вы меняете сервер или своего рода кластерный сценарий.
Специально для паролей предпочтительнее использовать хэш-алгоритмы (например, SHA256). Они не могут быть зашифрованы (например, сумма цифр). В случае использования функциональности входа в систему вы должны зашифровать ввод пользователя и сравнить хеши пользователя и тот, который находится в базе данных. (подробности см. ниже) Я также предлагаю добавить динамические критерии, такие как идентификатор пользователя, в hashinput, чтобы 2 пользователя с одинаковым паролем имели разные хеши.
С этой стратегией у вас нет риска с паролями пользователя, и поэтому, если данные будут утечкой, это не будет проблемой на данном этапе.
Вот краткий обзор использования хэш-алгоритмов.
Итак (если задана защищенная строка) сначала расшифруйте SecureString
String SecureStringToString(SecureString value){
IntPtr valuePtr = IntPtr.Zero;
try{
valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
return Marshal.PtrToStringUni(valuePtr);
}
finally{
Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
}
}
Чем хешировать, например, с помощью SHA256. Из этого сообщения
using (SHA256 hash = SHA256Managed.Create()) {
Encoding enc = Encoding.UTF8;
//the user id is the salt.
//So 2 users with same password have different hashes.
//For example if someone knows his own hash he can't see who has same password
string input = userInput+userId;
Byte[] result = hash.ComputeHash(enc.GetBytes(input));
foreach (Byte b in result)
Sb.Append(b.ToString("x2")); //You could also use other encodingslike BASE64
}
Сохраните этот хеш-сумм. В зависимости от вашей кодировки это может выглядеть так:
ac5b208b4d35ec79fa7c14b7a31f9c80392cdab2bc58bc5b79bcfe64b044d899
в вашей базе данных. Если пользователь входит в систему, создайте хэш из его входных данных и сравните его с хешем в базе данных. если они равны, значит пароль правильный. Поэтому вам никогда не нужно где-либо хранить пароль пользователя в виде открытого текста.
Если клиент создает хэш, он не должен существовать в виде открытого текста (кроме текстового поля, если он не поддерживает защищенную строку)
PS: это только один вариант. Но главное - никогда нигде не хранить незашифрованные пароли. Лучше никогда их не узнавать и не менять, чтобы их расшифровать.
Другая стратегия - использовать асимметричное шифрование, например RSA, но это может стать более сложным. Если вам нужна помощь с этим, я бы порекомендовал отдельный пост по этому поводу.
В зависимости от ваших требований и предпочтений в большинстве случаев приемлемым решением могут быть хеш-суммы. (Но это не юридическая консультация, поскольку я не юрист)
person
Boas Enkler
schedule
03.06.2015