Security авторизация на Java + Javascript

Security авторизация на Java + JavascriptДанный пост это продолжение темы про авторизацию только речь пойдет о Security или безопасной авторизации в админпанель сайта на Java. Ничем особым авторизация на Java от авторизации на PHP не отличается. На странице с формой для авторизации имеется Javascript который формирует хеш из суммы логина и пароля который и посылается на сервер для сравнения с хешем логина и пароля взятых из сеттингов движка.

При совпадении доступ в админку разрешается, в противном случае переход на страницу ошибки авторизации. Нюанс состоит в том, что на сервер в неизменном виде отправляется только хеш из суммы логина и пароля. Сами вбитые в соответствующие поля логин и пароль меняются на подставные строки-константы. В коде это выглядит примерно так: 


<form method="post" 
action="$turl/check.html">
<table width='100%'><tr><td align="center">
Логин:<br />
< input name='login' type="text" value='' id="login" size='30' onfocus="this.style.background='#ccffcc'" onblur="this.style.background='#ffffff'" /><br />
Пароль:<br />
< input name='pass' type="text" value='' id="password" size='30' onfocus="this.style.background='#ccffcc'" onblur="this.style.background='#ffffff'" /><br />
</td></tr>
<tr><td align="center">
<input type="submit" value="Войти" id="input" name="submit" />
</td></tr>
</table>
<input type="text" name="strcrypt" id="strcrypt" size="33" />
</form>
<script type="text/javascript"> /////////////////////////////////////// Здесь скрипт функции хеш sha1(ссылка на исходник в конце поста) /////////////////////////////////////// // регистрация события onclick document.getElementById('input').onclick = function() { // получить данные с полей login и password var login_string = document.getElementById('login').value; var password_string = document.getElementById('password').value; // поместить преобразованные данные в поле strcrypt document.getElementById('strcrypt').value = SHA1(login_string + password_string); // подстава вместо введенных логина и пароля document.getElementById('login').value = "login"; document.getElementById('password').value = "password"; </script>

На сервере формируется хеш из суммы логина и пароля взятого из сеттингов движка и сравнивается с полученным хешем из формы для авторизации. Функция, вернее метод, для формирования хеш на Java выглядит так:


private static String encryptPassword(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException {

        MessageDigest crypt = MessageDigest.getInstance("SHA-1");
        crypt.reset();
        crypt.update(password.getBytes("UTF-8"));

        return new BigInteger(1, crypt.digest()).toString(16);
    }
	
	а лучше так:
	
    static String sha1(String input) throws NoSuchAlgorithmException {
        MessageDigest mDigest = MessageDigest.getInstance("SHA1");
        byte[] result = mDigest.digest(input.getBytes());
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < result.length; i++) {
            sb.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
        }
         
        return sb.toString();
    }    	
	

Вот, собственно, и вся музыка. Что это дает? Ничего особенного, разве, что лишает злоумышленника перехватывать введенные в форму данные полей логина и пароля в неизменном виде после отправки их на сервер. Вместо них он получит заглушки-константы и хеш реально введенных логина и пароля. Наверняка, если повозиться то и с хешем можно справиться, но это уже длинная история не для ленивых.

Если по данной теме возникнут вопросы или замечания, то для этого имеется ссылка для добавления комментов. Исходный текст скрипта функции хеша SHA1.

Top.Mail.Ru