Я пытался поместить это в комментарии, но я думаю, что это достаточно важно, чтобы вставить ответ.
Схема, предложенная OP, является , а не , что обязательно является нарушением CWE-257. Предложение не позволяет системному администратору (скажем) восстановить старые пароли.
Предлагается использовать новый пароль в качестве ключа шифрования для всех старых паролей. Если вы можете жить с «проверкой нового пароля» на клиенте, а не на сервере, то это не менее безопасно, чем шифрование чего-либо еще с использованием пароля.
Таким образом, гаджет "изменить пароль" будет кодом на стороне клиента. Сервер отправит зашифрованный список из N более ранних паролей, которые клиент может расшифровать с помощью текущего пароля пользователя, а затем повторно зашифровать с помощью нового пароля пользователя. Сервер никогда не имеет достаточно информации, чтобы определить любой из паролей, старый или новый. Только клиент имеет эту информацию, но она имеет ее в любом случае ... Разница в том, что злоумышленник, который узнал ваш текущий пароль, также может узнать ваши старые пароли. Поскольку изучение вашего текущего пароля - это уже катастрофа, это не делает меня намного хуже.
Правда, это не защищает от «атаки» сотрудника, пишущего собственную утилиту смены пароля, чтобы обойти ограничения пароля, поскольку проверка не выполняется на стороне сервера. Но это никоим образом не является нарушением CWE-257, на мой взгляд.
На самом деле это довольно умная идея.