Проверьте, изменил ли пользователь данные - PullRequest
0 голосов
/ 18 ноября 2009

Когда пользователь регистрируется на нашем сайте, мы проверяем адрес с помощью службы проверки адресов. Эта служба может вернуть предложение адреса, если введенный адрес найден, но есть ошибки. Это предложение возвращается пользователю.

Пользователь может принять предложение и ему доверяют. Если он меняет адрес, ему не доверяют.

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

Алгоритм должен создать защищенный от взлома односторонний хеш.

EDIT:

До сих пор это работало довольно хорошо. Я все еще должен проверить с умляутом (ä, ü).

                StringBuilder addressData = new StringBuilder();
            addressData.Append(FirstName);
            addressData.Append(LastName);
            addressData.Append(StreetNumber);
            addressData.Append(StreetName);               
            addressData.Append(City);
            addressData.Append(CountryISO);
            addressData.Append(Zip);
            string stringVal = addressData.ToString().ToLower();

            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
            byte[] keyByte = encoding.GetBytes(ApplicationConfiguration.ShaKey);
            byte[] messageBytes = encoding.GetBytes(stringVal);

            HMACSHA256 hmacsha256 = new HMACSHA256(keyByte);
            byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
            string hash = ByteToString(hashmessage);

            return hash

Ответы [ 4 ]

1 голос
/ 18 ноября 2009

Используйте HMAC (код аутентификации сообщений на основе хеша) - HMAC были изобретены именно для этой цели; аутентифицировать данные с помощью симметричного ключа. Я сам не знаком с .NET, но стандартная библиотека, кажется, предоставляет много таких классов, унаследованных от System.Security.Cryptography.HMAC . HMAC лучше простого хеша, потому что он не уязвим для атак на расширение длины хеша .

HMACSHA256 выглядит хорошим кандидатом.

Вам также следует рассмотреть возможность добавления уникального значения (одноразовый номер) в строку, если вы хотите предотвратить предотвращение повторных атак - в противном случае пользователь может повторно отправить предыдущее электронное письмо с сопровождающей ранее подписью HMAC.

Ключ HMAC должен быть секретным на стороне сервера.

0 голосов
/ 18 ноября 2009

Если JavaScript разрешен, возможно, вы можете использовать jQuery change () Event и проверить это, установив скрытое значение на стороне клиента, чтобы узнать, изменилось ли что-то:

Событие изменения срабатывает, когда элемент управления теряет фокус ввода и его значение был изменен с момента получения фокуса.

$("input[type='text']").change( function() {
  //do something here, maybe set a hidden value
});

Тогда на вашем контроллере вы можете проверить это скрытое значение, или, может быть, вы можете пойти по вкусу и сразу же проверить значение с помощью некоторого ajax, но, возможно, из-за ваших требований безопасности это может быть рискованным.

0 голосов
/ 18 ноября 2009

Мне нравится ваша идея. Вы объединяете части адреса в одну большую строку и выполняете GetHashCode версии ToLower строки. и затем используйте тот же метод для сравнения.

0 голосов
/ 18 ноября 2009

Есть ли хороший способ проверить, данные, отображаемые пользователю, совпадают в качестве данных он публикует?

Да - вы можете хранить в базе данных данные, которые вы отправляете пользователю.

Когда пользователь отправляет форму, сравните данные в базе данных с данными, предоставленными пользователем. Вы можете преобразовать данные в хеш CRC32, но важно объединить разные объекты данных одинаково, если вы решите сравнивать строки хеша.

Edit: Кстати, я думаю, что создание хеш-строки было бы бесполезным, потому что данные хранятся в базе данных в любом случае и ненадолго.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...