Во-первых, обязательно: «Не придумывайте свою собственную схему паролей. Если вы не эксперт, вы сделаете это неправильно. Если вы эксперт, вы сделаете это неправильно творческим путем, который ужасно сломанный, но который будет невидимым, пока ваша схема не будет использована тысячами "
Далее, будьте уверены, что вы хотите защитить и почему. Вы упоминаете, что пароли пользователей в незашифрованном виде почему-то плохие. Вы обеспокоены тем, что пароль, который пользователь использует во многих местах, будет утекать вашим приложением, ставя под угрозу другие учетные записи пользователя, или вас больше беспокоит, что злоумышленник сможет получить доступ к учетной записи вашего пользователя?
Меня беспокоит то, что я прочитал в подтексте вашей идеи хеширования, что хеш, который отправляет клиент, никогда не изменится (если пароль не изменится). Это делает его равносильным тексту для аутентификации (злоумышленнику нужно только украсть хеш; затем он может аутентифицироваться, не зная пароля). Это также делает пароль немного более уязвимым для атак с использованием грубой силы кем-то, кто может видеть хэш.
У меня сложилось впечатление, что вы хотите избежать шифрования из-за опасений, что это ограничит доступность вашего приложения. Я могу понять эту причину.
Давайте предположим, что криптографически безопасный хэш не является криптографией (и я не знаю, так ли это или нет, но это не соответствует ограничениям на экспорт США, насколько я читал). Мое предложение было бы очень простым протоколом «запрос-ответ», который можно использовать для проверки того, что у пользователя есть пароль (я рекомендую вам посмотреть «протокол вызов-ответ» онлайн).
Одно предостережение: я не обращаюсь к получению пароля на сервер; просто сервер, проверяющий, что пользователь имеет правильный пароль для учетной записи. Думайте об этом как об общем понимании того, как вы могли бы предотвратить такие вещи, как атаки воспроизведения, и сделать жизнь злоумышленников, которые могут видеть поток данных, более сложной:
Клиент: «Я хочу аутентифицироваться как Джон Смит»
Сервер: «Хорошо,« Джон Смит », заявитель, возьмите текущую дату и время (2011-09-09 @ 12: 04: 33AM) и случайное число, которое я только что придумал: 4bazillion, и хешируйте его с помощью ваш пароль. Дайте мне знать, что вы получили. "
Клиент:
- запрашивает у пользователя пароль
- хэши
- Говорит: «Я получил: gaAGRtcq4qt22332.»
Сервер:
- принимает дату и время и случайное число и хэши с паролем
- сравнивает данные клиента с расчетными данными
- Если есть совпадение:
- Говорит: "Хорошо, ты внутри."
- В противном случае:
- Говорит: «Иди, колоть песок».