Существует ли идемпотентная хэш-функция? Я знаю, что MD5 и SHA256 не являются:
$ echo -n "hello world" | md5sum
5eb63bbbe01eeed093cb22bb8f5acdc3 -
$ echo -n "5eb63bbbe01eeed093cb22bb8f5acdc3" | md5sum
c0b0ef2d0f76f0133b83a9b82c1c7326 -
$ echo -n "hello world" | sha256sum
b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 -
$ echo -n "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9" | sha256sum
049da052634feb56ce6ec0bc648c672011edff1cb272b53113bbc90a8f00249c -
Есть ли алгоритм хеширования, который может сделать что-то подобное?
$ echo -n "hello world" | idempotentsum
abcdef1234567890
$ echo -n "abcdef1234567890" | idempotentsum
abcdef1234567890
Если такой алгоритм существует, полезен ли он с точки зрения криптографии? т.е. с разумными входными данными, вычислительно невозможно угадать входные данные с известным выходным сигналом?
Если такого алгоритма не существует, значит ли это, что его не существует потому, что его никто не удосужился найти, или это математическая невозможность?
Контекст
Я работаю над системой, в которой пользователь может захотеть сохранить пароль в диспетчере паролей. Особо параноидальный пользователь может предпочесть сохранить пароль в хешированной форме, а не в виде простого текста. Я бы хотел, чтобы пользователь мог пройти аутентификацию с помощью этого хешированного пароля. Вместо того, чтобы просто дважды пытаться выполнить аутентификацию (один раз, предполагая, что пароль пользователя хеширован, и один раз, предполагая, что это не так), я задался вопросом, существует ли алгоритм, позволяющий мне сделать это только один раз.
Я знаю, что есть альтернативные способы, позволяющие пользователям хранить токены аутентификации, а не простые текстовые пароли. Но эта идея пришла мне в голову, и мне стало любопытно. Я не мог найти ничего об этом в Google или SO.
РЕДАКТИРОВАТЬ: я не утверждаю, что разрешение пользователю аутентифицироваться с помощью хешированного пароля означает, что сервер может не солить/хешировать пароль. Сервер должен по-прежнему солить/хешировать исходный пароль или хешированный пароль на стороне клиента.
РЕДАКТИРОВАТЬ: я не утверждаю, что разрешение пользователю входить в систему с хешированным паролем на стороне клиента является настоящим улучшением безопасности. Насколько я знаю, единственное возможное преимущество, которое это добавит, - это если пользователь использовал этот пароль более чем для одной цели. В этом случае, если злоумышленник обнаружит хешированный пароль пользователя, то будет скомпрометирован только доступ к моей службе, а не ко всем службам, использующим этот пароль. Однако рекомендуется не использовать один и тот же пароль для нескольких служб.