Как часть моей повседневной жизни, я имею несчастье администрировать древнее, когда-то «внутреннее» веб-приложение JSP, которое полагается на следующую схему аутентификации:
...
// Validate the user name and password.
if ((user != null) && (password != null) && (
(user.equals("brianmay") && password.equals("queen")) ||
(user.equals("rogertaylor") && password.equals("queen")) ||
(user.equals("freddiemercury") && password.equals("queen")) ||
(user.equals("johndeacon") && password.equals("queen"))
)) {
// Store the user name as a session variable.
session.putValue("user", user);
...
Как бы мне ни хотелось, члены Queen никогда не были пользователями системы, но в любом случае это отличный пример, не так ли?
Несмотря на это, согласно политике, этот клиент, помимо прочего, обеспечивает безопасность путем аутентификации домена, поэтому эта проблема не рассматривается как угроза безопасности, тем не менее, моя идея состоит в том, чтобы, по крайней мере, скрыть эти учетные данные в виде обычного текста, используя, возможно, простой метод MD5 или SHA1, поэтому такие конфиденциальные данные не видны невооруженным глазом.
Когда дело доходит до JSP, я новичок, поэтому был бы признателен за любой совет, которым вы захотите поделиться со мной.
Заранее большое спасибо!




Прежде всего, вы должны переместить эту логику из jsp в отдельный класс.
Во-вторых, вы не должны хранить пароль в текстовом виде где-либо в коде. Используйте какую-то одностороннюю хеш-функцию (md5, sha1, ...) и сохраняйте только хеши паролей.
При проверке пароля пользователя сначала хешируйте его, а затем сравнивайте хеши.
Трудно понять точную схему, о которой вы думаете, но я предполагаю, что пароль поступает из запроса, и вы хотите вычислить хеш MD5 в JSP, на который отправляется запрос. После этого вы можете сравнить его с предварительно рассчитанной версией MD5. Вы могли бы даже быть более безопасными, если бы этого не делали с https, и использовать библиотека javascript MD5 для хеширования пароля перед его отправкой.
Вы можете MD5 строку в java следующим образом:
try
{
String digestInput = "queen";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(digestInput.getBytes());
BASE64Encoder base64Encoder = new BASE64Encoder();
String digestString = base64Encoder.encode(messageDigest.digest());
// digestString now contains the md5 hashed password
}
catch (Exception e)
{
// do some type of logging here
}
Красивый! Большое спасибо! Каким будет самый простой способ сохранить этот хэш MD5? Обычный текстовый файл?
Конечно, предварительное вычисление с помощью js будет более безопасным, только если пароль используется в других местах. В противном случае предварительное вычисление хэша означает, что вы просто сравниваете две строки на стороне сервера, и это не более безопасно, чем сравнение голых паролей. Злоумышленник может просто отправить хэш вручную.
Я не думаю, что мы уполномочены реализовывать решения на JS для этого конкретного клиента, поэтому мне пришлось бы придерживаться хранения предварительно рассчитанного MD5, а затем сравнивать. Не могли бы вы подсказать, как реализовать это в JSP?
Используйте код Карсона, чтобы получить хэш. Первый раз сохраните его, после этого вычислите и сравните сохраненное значение. База данных - это общее хранилище. Проблема с текстовым файлом заключается в том, что вам придется синхронизировать доступ к нему, чтобы несколько пользователей не пытались писать в него одновременно.
Большое спасибо за ответ, приятель. Не могли бы вы подробнее рассказать о тех методах, которые вы упомянули?