Выражаясь в двух словах, вы думаете об этом:
На стороне сервера у вас есть:
- база данных, с Логин/пароль совпадает.
- скрипт, который принимают 2 параметра (пароль и имя пользователя) и проверить в базе данных, если пара существует
Ваша задача:
Когда локальное приложение вызвать скрипт PHP на стороне сервера, то 2 параметры приведены в виде простого текста. И вы хотите, чтобы избежать несанкционированного доступа (если ваш сценарий безопасны от инъекции я вижу только фальсификация используется для BruteForce на авторизацию < = иметь в виду, что я буду держать это предположение в целом пост)
Ваше решение:
- на стороне клиента, шифровать 2 параметра
- на стороне сервера, добавьте соль в сценарии посолить
- Затем расшифровать 2 параметра и зашифровать с солью
Что я думаю:
Это не решит проблему подделывания, кто-то все еще может подделывать запросы. Первое шифрование бесполезно, потому что кто-то может отменить ключ, используемый вашим клиентом. Второе шифрование недостаточно безопасно, потому что вы используете одну соль для всех пользователей.
Что я предлагаю:
Признайте, что фальсификация не может быть предотвращено, если не использовать безопасный протокол HTTPS, как (можно либо использовать SSL или TLS). Если вы хотите приемлемую безопасность без HTTPS следующего, что я бы реализовать:
- Токена системы, вы будете проверять, чтобы увидеть, если пользователь может выполнить операцию Логина
- имени пользователя, которое не будет шифроваться
- пароль sha1 HASHED хранится в базе данных
- на стороне клиента, вызовите сценарий и предоставить имя пользователя, как не зашифрованы и пароль в качестве хэш SHA1, подогреты со случайной солью (sha1 (sha1 (пропуск) + соль) (соль хранится в сеансе пользователя на стороне сервера)
- Сценарий затем сравнил предоставленный хэш с дб хэшем пароля подогрет с сеансом солью
Улучшения в том, что злоумышленник должен попытаться грубой силой два sha1 пароля consecutivaly и должен предоставить действительный маркер для выполнения действия входа , Плюс, если вы используете в качестве соли строку с использованием шестнадцатеричного символа переменной длины, это сделает работу более трудной для злоумышленника, узнав, что значение, выполняемое вторым хэшем, является хэшем sha1, и даже если он знает, что это sha1 придется проверить несколько случаев, чтобы попытаться найти нужную часть значения, соответствующую хешу.
Из-за переменной соли один и тот же пароль не будет одинаковым, если хэширование: Представьте, что злоумышленник обнюхал хэш и знал, какой пароль использовался, а затем нюхает другой хеш, который был сделан с тем же паролем, что и другой, злоумышленник не сможет узнать, что пароль 2, где тот же (немного переполненный, но по-прежнему полезный).
Безопаснее хранить пароль как хэшированное значение, потому что, если злоумышленнику удастся сбросить вашу пользовательскую таблицу, он не сможет сразу использовать пароли, он должен будет выполнить команду brutforce каждый из них. Наконец, хэш-код sha1 более безопасен, чем md5 (скажу вам, что, поскольку вы использовали тэг md5 в своем сообщении)
Недостатком этого метода является то, что пароли не могут быть отменены, поэтому вы не сможете дать они возвращаются к вашим пользователям, если они потеряли его. Вам придется заставить их установить новый.
Жесткий путь (по-прежнему без использования HTTPS) должен был бы зашифровать ваш пароль и имя пользователя сильным cypher (например, AES или 3DES) и использовать безопасный ключ echange algorythm (например, Diffie Hellman) для обмена случайным общим ключ.
Этот метод не будет блокировать фальсификацию, но будет винить злоумышленника, потому что он не сможет расшифровать значение (предполагая, что он только обнюхивает сеть). Ключ случайный и никогда не жестко закодирован ни в одном из ваших приложений, поэтому, даже если кто-то отменит ваш клиент, он не сможет получить ключ. Я бы порекомендовал хранить ваше значение пароля с hash.
Крайним способом было бы объединить 2 метода, но было бы полностью переборщить.
Надеюсь, что это даст вам идеи
Как это отличается от ситуации входа в систему _normal_? Если у вас есть доступное шифрование, используйте его обычным, правильным способом. – Halcyon
, когда вы храните пароли на своем сервере в виде хеш-строк, которые вы должны в любом случае. (например, sha256 или что-то подобное), лучше всего было бы создать хэш-клиентскую сторону и передать хэш только серверу. остальное - простое сравнение строк. не требуется расшифровка. – Rufinus
Зашифрованный пароль, присвоенный URL-адресу, не может быть расшифрован человеком. Тем не менее, он может быть повторно использован как есть (то есть зашифрован) хакером для другого соединения. – Skrol29