Info
,
и вы вычисляете индекс последнего элемента Info
,
это не так. имеет смысл использовать его для индексации в en
(другой массив). $ en [$ lst], а
$ { ru [$ lst] }
Во-первых, ваша непосредственная синтаксическая ошибка: "$ line"
- это 6-символьная строка dollar, space, l
, i
, n
, e
. Чтобы взять значение переменной line
, используйте "$line"
. Обратите внимание, что если значение -e
или -E
, echo
воспримет его как опцию и ничего не выведет. Чтобы избежать этого, используйте printf %s
. Кроме того, обычный read
удаляет пробельные символы в начале и конце строки и рассматривает обратные слэши как управляющие символы; чтобы прочитать строку буквально, используйте IFS= read -r
.
while IFS= read -r line; do
printf %s "$line" | …
fi
Не используйте SHA-256 для хэширования паролей. Хотя это лучше, чем обычный текст, это все равно плохо. SHA-256 не является приемлемым способом хэширования паролей, поскольку хэши паролей должны быть солеными и медленными. Подробное объяснение см. в Как безопасно хэшировать пароли?. Вы можете использовать общедоступную утилиту mkpasswd
для генерации приличных хэшей паролей; используйте SHA-256 или SHA-512 (несмотря на название, они нормальные, потому что на самом деле они не вычисляют хэш SHA2, а вычисляют итерированный хэш, что приемлемо медленно). Сгенерированный хэш включает случайную соль.
printf %s "$line" | mkpasswd -s -m SHA-512
В своем приложении вызовите системную функцию crypt
для проверки этих хэшей. Если используемый вами язык программирования не дает доступа к стандартной библиотечной функции crypt
, используйте библиотеку PBKDF2, bcrypt или scrypt, и используйте ее для генерации преобразованных хэшей (опять же, не используйте простой SHA-256 или SHA-512).
EDIT Вместо sha256sum, гораздо лучше использовать что-то более надежное. (Шляпная подсказка: пользователь Gilles). Процедура glibc crypt
итерирует соленую строку через sha256 минимум 5000 раундов. Идея заключается в том, что это заставляет взломщиков паролей тратить гораздо больше ресурсов/времени на поиск подходящей строки. Вы можете использовать эту технику практически на любой системе, заменив sha256sum
:
sha256sum() {
read password
salt=`openssl rand -base64 8`
perl -le "print crypt('${password}','\$6\$${salt}\$')";
}
Это генерирует 8-символьную соль и передает первую строку ввода и сгенерированную соль через crypt
.
Если ваш ввод - это что-то вроде username,password
без кавычек или чего-либо еще, вы можете использовать... несколько методов для этого. Один из них:
while IFS=, read username pass ; do
/bin/echo -n "$username,"
echo "$pass" | sha256sum |cut -d' ' -f1
done < input.txt >output.txt
В этой версии ваш вывод теперь username,hash
и каждая строка соответствует вводу первого файла.