BlackBerry App Security - PullRequest
       2

BlackBerry App Security

1 голос
/ 11 февраля 2011

Пользователи входят в мое приложение BlackBerry, используя имя пользователя и пароль, указанные при регистрации. Мое приложение подключается к веб-службе Java, которая выполняет всю логику.

  • Как мне безопасно хранить пароль и имя пользователя на моем сервере? Все говорят, что солят и перемешивают, но я понятия не имею, как это сделать, так как никогда не работал с этим. Как я могу сделать это на Java?

  • Как мне безопасно отправить пароль из приложения на сервер?

Ответы [ 3 ]

2 голосов
/ 11 февраля 2011

Похоже, ваш вопрос состоит из нескольких частей ...

Самый безопасный способ сохранить пароль в базе данных - это использовать хэш с семенами Salt + Pepper, как описано здесь . Если вы хотите найти хороший способ реализации этого конкретного метода в Java, попробуйте открыть новый вопрос .

Я понимаю, почему имеет смысл шифровать хэш имени пользователя / пароля перед отправкой на сервер, поскольку прокси-серверы SSL могут быть посредником в этой операции.

В качестве решения попробуйте создать токен в формате JSON или XML со следующими свойствами:

  • Username.ToUpper () // Не хочу, чтобы это чувствительно к регистру
  • ExpiryDate (скажем, плюс 5 минут)
  • Nonce (случайное число, которое сохраняется на сервере для предотвращения повторных атак)
  • подпись SHA 256

Используйте локально введенные имя пользователя и пароль для создания подписи SHA256, так как она будет постоянной. Используйте эту подпись для подписи JSON или XML, отправляемых на сервер при каждом запросе.

Другими словами, вы используете симметричный ключ на основе имени пользователя и пароля, не отправляя его по проводам. Конечно, вы можете посолить и приправить этот симметричный ключ для большей безопасности.

Это все, что я получил за дизайн высокого уровня, так как я не очень хорошо знаком с Java. Поделитесь своими ссылками / кодом, когда найдете ответы.

2 голосов
/ 11 февраля 2011

Для хранения учетных данных можно использовать PBKDF2. Реализация Java (которую я не использовал) доступна здесь . Запустите пароль, указав через него значение соли, и сохраните полученные хеш-данные. Солт-значение обычно является вновь сгенерированным случайным значением (по одному для каждого пароля). Это помогает предотвратить атаки по словарю через радужные таблицы (предварительно вычисленные таблицы хешированных паролей). Использование java.security.SecureRandom позволяет генерировать их.

Клиентское приложение, вероятно, должно подключаться к серверу с использованием SSL / TLS. Это обеспечит шифрование для защиты учетных данных при передаче от клиента к вашему серверному приложению.

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

  • Предлагаемая схема (я думаю) состоит в том, чтобы отправить от клиента серверу это значение: Hash(Hash(password,origsalt),randomsalt). На самом деле это означает, что пароль эффективен Hash(password,origsalt). Если злоумышленник может получить эту информацию, он может войти в систему как этот пользователь, поскольку он принимает это значение и хеширует его с новым солт-значением для аутентификации. Другими словами, если база данных хешированных паролей взломана, злоумышленник может легко получить доступ. Это в некоторой степени отрицательно сказывается на назначении паролей и хэшировании паролей.
  • Без SSL (или какого-либо другого сквозного шифрования) существует вероятность атаки «человек посередине». Они могут либо слушать, либо выдавать себя за один конец разговора.
0 голосов
/ 16 февраля 2011

Итак, вот что я в итоге сделал:

package Utils;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.RandomStringUtils;
/**
 *
 * @author octavius
 */
public class SalterHasher {

    private String salt;
    private String pepper = "******************";
    private String hash;
    private String password;

    public SalterHasher(String password, String username)
    {
        this.password = password;
        salt = RandomStringUtils.random(40, username);
        hash = DigestUtils.md5Hex(password + salt + pepper);
    }


    public String getHash(){
        return hash;
    }
    /**
     * @return the salt
     */
    public String getSalt() {
        return salt;
    }

    public String makeHash(String salt){

        return DigestUtils.md5Hex(password + salt + pepper);
    }



}

Очень простой класс, который генерирует соль и хэш для меня и включает перец для дополнительной безопасности, функцию makeHash(), которую я использую для проверки, когда пользователь входит в систему. Ввиду того, что я ранее упомянул в комментариях Выше я не использовал предложенный мной процесс проверки и решил просто добавить перец в мой код на стороне сервера, поскольку, как я полагаю, хеширование окажется тяжелым для устройства BlackBerry. Еще раз спасибо тем, кто помог мне. Хорошие обсуждения были:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...