Я также думаю, что № 2 является лучшим выбором, хотя я, несомненно, обернул бы его в транзакцию в случае, если что-то идет неправильная середина обновления.
альтернатива (так как Вы спросили) к обновлению значений Уникального индекса с различными значениями должна будет обновить все другие значения в строках к той из другой строки. Выполнение этого означает, что Вы могли оставить значения Уникального индекса в покое, и в конце, Вы заканчиваете с данными, которые Вы хотите. Будьте осторожны, хотя, в случае, если некоторые другие ссылки на таблицу эта таблица в отношениях Внешнего ключа, что все отношения в DB остаются неповрежденными.
Не уверен, что вы подразумеваете под автоматически, но вам действительно следует использовать SHA256
и выше . Также всегда используйте соль ( код ) с вашими хэшами. Примечание: по прошествии времени использование усиленных хешей намного лучше, чем использование простой хеш-функции на основе скорости. То есть: хеширование в течение нескольких сотен итераций или использование уже проверенных функций хеширования, таких как bcrypt
(которые, как мне кажется, упоминаются ниже). Пример кода для использования хэш-функции SHA256 в .NET выглядит следующим образом:
byte[] data = new byte[DATA_SIZE];
byte[] result;
using(SHA256 shaM = new SHA256Managed()) {
result = shaM.ComputeHash(data);
}
Подойдет для вас с помощью SHA256 и находится на MSDN .
Замечание о «взломе» SHA1 : Перспективы взлома SHA-1
SHA1 сильнее, чем MD5, поэтому, если у вас есть выбор, лучше использовать его. Вот пример:
public static string CalculateSHA1(string text, Encoding enc)
{
byte[] buffer = enc.GetBytes(text);
SHA1CryptoServiceProvider cryptoTransformSHA1 = new SHA1CryptoServiceProvider();
return BitConverter.ToString(cryptoTransformSHA1.ComputeHash(buffer)).Replace("-", "");
}
Из MSDN
byte[] data = new byte[DATA_SIZE];
byte[] result;
SHA1 sha = new SHA1CryptoServiceProvider();
// This is one implementation of the abstract class SHA1.
result = sha.ComputeHash(data);
Оба слишком быстры, чтобы их можно было использовать, по крайней мере напрямую. Используйте усиление ключа, чтобы «замедлить» процедуру хеширования пароля. Скорость, к сожалению, враг безопасности паролей.
Насколько медленно достаточно медленно? Замедление хэша пароля с ~ микросекунд до ~ сотен миллисекунд не повлияет отрицательно на воспринимаемую производительность вашего приложения... но сделает взлом паролей буквально в сто тысяч раз медленнее.
Подробнее см. в этой статье: http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html
проблема в том, что MD5 работает быстро. Как и его современные конкуренты, такие как SHA1 и SHA256. Скорость — это цель проектирования современного безопасного хэша, потому что хэши являются строительным блоком почти каждой криптосистемы и обычно выполняются по требованию для каждого пакета или сообщения.
Скорость — это именно то, что вам не нужно в хэш-функции пароля.
... отрезок...
В игре с атакой на пароль оценивается время, необходимое для взлома пароля X. В случае с радужными таблицами это время зависит от того, насколько большой должна быть ваша таблица и насколько быстро вы можете в ней искать. С инкрементными взломщиками время зависит от того, насколько быстро вы сможете запустить хэш-функцию пароля.
Тем не менее, используйте BCrypt. SCrypt был недавно разработан, но я сомневаюсь, что для него существуют какие-либо стабильные (или готовые к эксплуатации) библиотеки. Теоретически SCrypt претендует на улучшение BCrypt.«Создание собственного» не рекомендуется, но повторение MD5 / SHA1 / SHA256 тысячи раз должно помочь (например, усиление ключа).
А если вы о них не знаете, обязательно почитайте о Rainbow Tables. Основные элементы безопасности.