Невозможно получить желаемый результат, если пароль содержит символ доллара ($) при выполнении команды openssl passwd -apr1 - PullRequest
0 голосов
/ 28 мая 2020

Я запускаю следующую команду, чтобы сгенерировать ha sh для заданного пароля на терминале Linux.

openssl passwd -apr1 'Test123$Pwd' 
$apr1$lWLP.Qc0$f/YdAVqsYFglu1EnLvzUS.

Я написал простой сценарий оболочки, который генерирует ha sh для заданного пароля. Вот мой сценарий оболочки: (Следует ли мне что-либо изменить здесь, в сценарии оболочки, чтобы включить одинарные кавычки вокруг $ 1)

echo -n "$ 1" | openssl passwd -apr1 $ 1

Теперь проблема в том, что когда я вызываю тот же сценарий оболочки из программы java, по какой-то причине, если пароль содержит символ доллара ($), он работает не так, как ожидалось .

Вот мой java код, который вызывает вышеуказанный сценарий оболочки:

void test(String password){
    String script = "sh test.sh %s";
    String command = String.format(script, password);
    - - - 
    execute(command); // execute using ProcessBuilder
    - - - 
 }

Приведенный выше код отлично работает, если пароль не содержит символа доллара. Но если пароль содержит $ char, он игнорирует текст после символа $ и генерирует ha sh для оставшегося пароля только до $.

Например: если я передаю пароль как Test $ Pwd

ha sh создается только для Test вместо Test $ Pwd

Я пытался установить одинарную кавычку в коде java, как показано ниже, но это тоже не сработало. При выполнении с использованием java по какой-то причине он по-прежнему генерирует ha sh для Test123 вместо Test123 $ Pwd

Измененный код java для включения одинарная кавычка, как показано ниже:

"sh test.sh '%s'";

Наблюдал за следующей командой в журналах, которая имеет одинарные кавычки, и это также не сработало, когда я запустил сценарий оболочки из java.

openssl passwd -apr1 'Test123$Pwd'

С терминала Linux, когда я запускаю сценарий, он работает нормально.

sh test.sh 'Test123$Pwd'  -- this works
sh test.sh Test123$Pwd    -- this doesn't work (generates hash only for Test123 even when run directly on the linux terminal)

Я не понимаю, нужно ли мне изменять сценарий оболочки или что-то в java?

Любые указатели были бы полезны. Спасибо!

1 Ответ

0 голосов
/ 28 мая 2020

В сценариях оболочки двойные кавычки - это способ обойти пробелы, которые рассматриваются как разделители. Это не исключает подмены переменных. Так вот что вам нужно здесь; одинарные кавычки будут передавать литерал $1, например, доллар, затем 1, а не «подставить здесь первый аргумент скрипта». Однако вы передаете $ 1 прямо вверх без кавычек для второго.

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

Почему бы не выполнить go сценарий оболочки и не вызвать openssl напрямую? Вы можете заменить стандарт в (и, таким образом, отправить то, что эхо отправляет в вашем скрипте), и аргументы, передаваемые через параметры ProcessBuilder s List<String> / String... (никогда не используйте параметр одной строки, действительно, это сложно читать и просит java попытаться превратить пробелы в разделители, здесь плохая идея) - так как теперь вы передаете необработанные параметры без bash или какой-либо другой оболочки, которую вы пытаетесь «интерпретировать» этот пароль, который вы не используете Я не хочу, чтобы это происходило.

Или, еще лучше, зачем вы вызываете сценарий оболочки?

apr1 - это, если память не изменяет, ключ шифрования, указывающий «MD5, выполнено 1000 раз». Это УЖАСНЫЙ в том смысле, что это банально разложенный и сломанный способ хеширования паролей. Это также то, для чего вам вообще не нужен openssl, вы можете легко сделать это из java.

Итак, вот мой совет:

  1. Пересмотрите apr1. Это чертовски небезопасно, вы этого не хотите. Используйте bcrypt, scrypt или pbkdf2. Вероятно, bcrypt.
  2. Прекратите обрабатывать эту работу через exe c, сделайте это в java. Например, используйте jBCrypt .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...