Я делаю программу на C, которая позволяет пользователю зарегистрироваться и войти. Когда пользователь регистрируется, я хочу сохранить его имя пользователя и пароль в файле.
Как я понял, лучший способ сделать это - добавить случайную соль в конец пароля, а затем сохранить защищенный хэш (например, SHA-1) соленого пароля.
Мой вопрос: если я локально храню имя пользователя, хеш и соль в текстовом файле, что мешает злоумышленнику просто изменить хэш и соль в файле на свой собственный хэш SHA-1 со своей солью, а затем записать в использовании его нового пароля?
Спасибо.Безопасное хранение пароля локально
ответ
Это зависит от того, имеет ли злоумышленник доступ только к этому файлу паролей, или если он имеет доступ к исполняемому файлу, а также. В последнем случае вы можете только усложнить обмен хешами, но вы не можете полностью предотвратить это.
В первом случае, по можно использовать HMAC проверить сохраненный хэш:
- Вашего приложение будет содержать секретный ключ сильного, и вычисляющую HMAC хэша с этим ключом.
- Этот HMAC может храниться вместе с хэшем пароля в файле.
- При чтении хэша для проверки программное обеспечение снова вычисляет HMAC и может сравнивать его с сохраненным.
Злоумышленник не сможет создать правильный HMAC для своих хэшей, если он не знает секретного ключа в вашем приложении. Итак, мы получаем то, что файл паролей не может быть изменен, но вашим приложением, безопасность сосредоточена в ключе вашего приложения. То же самое можно сделать при шифровании/расшифровке файла паролей.
P.S. Пожалуйста, не используйте SHA- для хранения паролей, вместо этого используйте хеш-функцию с таким коэффициентом затрат, как BCrypt, PBKDF2 или SCrypt.*
Кажется, у вас на сервере установлен только один сервер, на котором размещается приложение, а также имя пользователя и хешированный пароль. В этой конфигурации нет идеальной защиты от того, что злоумышленник является корневым.
Однако, вы можете попробовать, чтобы иметь хорошие характеристики:
- хэшированный пароль делает его трудно злоумышленник получить пароль и использовать приложение с учетными данными пользователя
- злоумышленник может действительно изменить хэш. Чтобы предотвратить это, вы могли бы попытаться защитить этот файл, либо:
- обнаружения изменений по сравнению с удаленной копией
- или использовать подпись на нем: в основном, позволяя только приложение для обновления пароля. Вы можете иметь секретный ключ в приложении, используемый для подписи файла, и добавить подпись в конце. Когда приложение читает файл для проверки подлинности, он может проверить, был ли файл поврежден или нет. Вероятно, злоумышленнику будет сложно получить этот механизм подписи, но, конечно, ничего невозможного.
Если злоумышленник уже имеет такой уровень доступа, то зачем им нужно входить в систему, когда они могут просто вытащить все данные, которые они хотят напрямую? –
Ну, это именно то, что я хочу предотвратить. Как запретить злоумышленнику доступ к данным, хранящимся локально? – Matan
Я думаю, что одна возможность шифрования вашего текстового файла. Тем не менее, ваша двоичная программа имеет информацию о том, как ее расшифровать, поэтому злоумышленник не может понять это, но это может быть очень сложно, если вы достаточно затмеваете все. – Milack27