Скрыть / зашифровать пароль в файле bash, чтобы случайно его не увидеть

Скрыть / зашифровать пароль в файле bash, чтобы случайно его не увидеть

23.07.2010 06:04:13 Просмотров 101 Источник

Извините, если об этом спрашивали раньше, я проверил, но ничего не нашел...

Есть ли в Unix функция для шифрования и расшифровки пароля в пакетном файле, чтобы я мог передать его в некоторые другие команды в файле bash?

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

Я бегу по красной шляпе 5.3.

У меня есть сценарий, который делает что-то подобное этому:

serverControl.sh -u admin -p myPassword -c shutdown

и я хотел бы сделать что-то вроде этого:

password = decrypt("fgsfkageaivgea", "aDecryptionKey")
serverControl.sh -u admin -p $password -c shutdown

Это никоим образом не защищает пароль, но не дает кому-то случайно увидеть его через мое плечо.

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it#comment3440382_3318853
Не могли бы вы объяснить подробнее?

Ответы - Скрыть / зашифровать пароль в файле bash, чтобы случайно его не увидеть / Hide/encrypt password in bash file to stop accidentally seeing it

Lèse majesté

23.07.2010 06:08:52

Вы должны быть в состоянии использовать crypt, mcryptили gpgдля удовлетворения ваших потребностей. Все они поддерживают ряд алгоритмов. cryptнемного устарела.

Дополнительная информация:

https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it/3318903#comment3440457_3318903
К сожалению, ни один из них не доступен в моей системе (Red Hat 5.3-извините, я должен был сказать)
https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it/3318903#comment3440738_3318903
Рич: у вас есть корневой доступ? Если да, то вы сможете установить эти пакеты, которые должны быть доступны для всех дистрибутивов Linux.
Является ответом!
Kaleb Pederson

23.07.2010 06:23:24

OpenSSL предоставляет команду passwd, которая может шифровать, но не расшифровывает, поскольку она делает только хэши. Вы также можете скачать что-то вроде aesutil, чтобы использовать способную и хорошо известную процедуру симметричного шифрования.

Например:

#!/bin/sh    
# using aesutil
SALT=$(mkrand 15) # mkrand generates a 15-character random passwd
MYENCPASS="i/b9pkcpQAPy7BzH2JlqHVoJc2mNTBM=" # echo "passwd" | aes -e -b -B -p $SALT 
MYPASS=$(echo "$MYENCPASS" | aes -d -b -p $SALT)

# and usage
serverControl.sh -u admin -p $MYPASS -c shutdown
https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it/3319056#comment21555308_3319056
Я считаю, что использование стиля $(echo $FOO)рекомендуется по сравнению со стилем `echo $FOO`.
https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it/3319056#comment36040371_3319056
Я немного поискал, и оказалось, что ссылка все еще действительна, но целевой сайт в настоящее время неправильно настроен :(.
https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it/3319056#comment59599852_3319056
Это как раз то, что мне нужно! Кроме... это тривиально для людей, чтобы запустить команду декодирования, чтобы получить пароль открытого текста. Это может быть глупый вопрос, но есть ли способ помешать пользователю получить пароль?
Ashton

23.07.2010 06:38:23

  • отступите от края экрана (при условии, что вы не используете перенос строк и у вас есть постоянная ширина редактора)

или

  • сохраните его в отдельном файле и прочитайте.
https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it/3319184#comment19078213_3319184
Хранение незашифрованного пароля в файле? Это большое-большое "нет-нет".
https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it/3319184#comment24263689_3319184
Зашифрованный или незашифрованный не имеет никакого практического значения здесь, вопрос был о предотвращении обнаружения пароля через плечо. В контексте вопроса шифрование пароля - это не более чем театр безопасности, и если не понимать, что шифрование здесь не является эффективной мерой безопасности, предполагая, что оно может обеспечить опасное и ложное чувство безопасности.
https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it/3319184#comment59607831_3319184
@Ashton шифрование пароля так, чтобы он оставался в файле в состоянии покоя зашифрованным, - это безопасная вещь. Если алгоритм шифрования использует ключ, который не включен в резервную копию или недоступен никому, кроме вошедшего в систему пользователя. Многие недавние взломы файлов паролей и баз данных были прямым результатом отсутствия шифрования конфиденциальных данных в файлах и / или строках хранилища данных.
https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it/3319184#comment88039039_3319184
Не очень полезные решения.
White_Nazgul

23.02.2015 09:05:14

Я использовал base64 для преодоления той же проблемы, то есть люди могут видеть мой пароль через мое плечо.

Вот что я сделал: - Я создал новый файл " db_auth.cfg " файл и созданные параметры с одним из которых является мой пароль БД. Я установил разрешение как 750 для файла.

DB_PASSWORD=Z29vZ2xl

В моем сценарии оболочки я использовал команду "source", чтобы получить файл, а затем декодировать его обратно для использования в моем сценарии.

source path_to_the_file/db_auth.cfg
DB_PASSWORD=$(eval echo ${DB_PASSWORD} | base64 --decode)

Надеюсь, это поможет.

https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it/28680326#comment59607764_28680326
Как уже упоминалось выше, кодирование-это не то же самое, что шифрование. Хотя вы могли запутать пароль и предотвратить случайный плечевой серфинг, его можно легко восстановить: ваш DB_PASSWORD-это "google".
user133617

05.01.2016 01:06:53

Следующая строка в приведенном выше коде не работает

DB_PASSWORD=$(eval echo ${DB_PASSWORD} | base64 --decode)

Правильная линия-это:

DB_PASSWORD=`echo $PASSWORD|base64 -d`

И сохраните пароль в другом файле в качестве пароля.

https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it/34600748#comment68948515_34600748
В общем случае это неверно. Очень старые реализации sh, возможно, не поддерживают современный $(command substitution), но он был частью POSIX в течение, ну, десятилетий. (Но, между прочим, оба приведенных выше примера неверны из-за неправильного цитирования строки, которую вы передаете в echo.)
https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it/34600748#comment86431706_34600748
Вместо того чтобы говорить, что это просто не работает, вы должны указать, что в некоторых старых версиях shсинтаксис $(cmd)не поддерживается.
EasyLife

21.05.2016 11:54:05

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

http://www.kinglazy.com/shell-script-encryption-kinglazy-shieldx.htm

На приведенной выше странице все, что вам нужно сделать, это отправить свой сценарий и дать ему правильное имя, а затем нажать кнопку загрузки. Для вас будет создан zip-файл. Щелкните правой кнопкой мыши на ссылке для загрузки и скопируйте указанный URL-адрес. Затем перейдите в окно UNIX и выполните следующие действия.

Установка:

1. wget link-to-the-zip-file
2. unzip the-newly-downloaded-zip-file
3. cd /tmp/KingLazySHIELD
4. ./install.sh /var/tmp/KINGLAZY/SHIELDX-(your-script-name) /home/(your-username) -force

Приведенная выше команда установки сделает для вас следующее:

  1. Установите зашифрованную версию вашего скрипта в директорию /var/tmp/KINGLAZY / SHIELDX-(your-script-name).
  2. Он разместит ссылку на этот зашифрованный скрипт в любом каталоге, который вы укажете в замене /home/(your-username) - таким образом, он позволит вам легко получить доступ к скрипту без необходимости вводить абсолютный путь.
  3. Гарантирует, что никто не сможет изменить сценарий - любые попытки изменить зашифрованный сценарий сделают его неработоспособным...до тех пор, пока эти попытки не будут остановлены или удалены. Он даже может быть настроен так, чтобы уведомлять вас всякий раз, когда кто-то пытается сделать что-то со сценарием, кроме его запуска...то есть попытки взлома или модификации.
  4. Гарантирует, что никто не сможет сделать его копии. Никто не может скопировать ваш сценарий в укромное место и попытаться обойти его, чтобы посмотреть, как он работает. Все копии скрипта должны быть ссылками на Исходное расположение, которое вы указали при установке (Шаг 4).

ЗАПИСКА:

Это не работает для интерактивных сценариев, которые запрашивают и ждут ответа пользователя. Значения, которые ожидаются от пользователя, должны быть жестко запрограммированы в сценарии. Шифрование гарантирует, что никто не сможет увидеть эти значения, поэтому вам не нужно беспокоиться об этом.

ОТНОШЕНИЕ:

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

https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it/37367891#comment74289760_37367891
С какой стати кому-то отправлять свой скрипт, потенциально содержащий их пароли, на вашу веб-страницу? Почему бы вам не опубликовать свой" KingLazySHIELD " (неудачное название, поскольку это звучит так, как будто вы просто хотите собирать пароли и очень ленивы) исходный код для всеобщего обозрения? Таким образом, никакие пароли не отправляются на подозрительные веб-сайты. PS любой человек с доступом может скопировать файл, что это на самом деле делает? Этот ответ просто выглядит как гигантский красный флаг
https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it/37367891#comment88039011_37367891
Согласен с Xen2050. Здесь кроется опасность!
Juanu

16.12.2016 01:18:58

Другое решение, без оглядки на безопасность (я также думаю, что лучше хранить учетные данные в другом файле или в базе данных) - зашифровать пароль с помощью gpg и вставить его в скрипт.

Я использую пару ключей gpg без пароля,которые я храню в usb. (Примечание: при экспорте этой пары ключей не используйте --armor, экспортируйте их в двоичном формате).

Сначала зашифруйте свой пароль:

EDIT: поставьте пробел перед этой командой,чтобы она не была записана историей bash.

echo -n "pAssw0rd" | gpg --armor --no-default-keyring --keyring /media/usb/key.pub --recipient someone@mail.com --encrypt

Это будет распечатка зашифрованного пароля gpg в стандартном выводе. Скопируйте все сообщение целиком и добавьте его в скрипт:

password=$(gpg --batch --quiet --no-default-keyring --secret-keyring /media/usb/key.priv --decrypt <<EOF 
-----BEGIN PGP MESSAGE-----

hQEMA0CjbyauRLJ8AQgAkZT5gK8TrdH6cZEy+Ufl0PObGZJ1YEbshacZb88RlRB9
h2z+s/Bso5HQxNd5tzkwulvhmoGu6K6hpMXM3mbYl07jHF4qr+oWijDkdjHBVcn5
0mkpYO1riUf0HXIYnvCZq/4k/ajGZRm8EdDy2JIWuwiidQ18irp07UUNO+AB9mq8
5VXUjUN3tLTexg4sLZDKFYGRi4fyVrYKGsi0i5AEHKwn5SmTb3f1pa5yXbv68eYE
lCVfy51rBbG87UTycZ3gFQjf1UkNVbp0WV+RPEM9JR7dgR+9I8bKCuKLFLnGaqvc
beA3A6eMpzXQqsAg6GGo3PW6fMHqe1ZCvidi6e4a/dJDAbHq0XWp93qcwygnWeQW
Ozr1hr5mCa+QkUSymxiUrRncRhyqSP0ok5j4rjwSJu9vmHTEUapiyQMQaEIF2e2S
/NIWGg==
=uriR
-----END PGP MESSAGE-----
EOF)

Таким образом, только если usb установлен в системе, пароль может быть расшифрован. Конечно, вы также можете импортировать ключи в систему (менее безопасный или вообще не защищенный), или вы можете защитить закрытый ключ паролем (поэтому он не может быть автоматизирован).

https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it/41174250#comment83831705_41174250
Никогда echoсвой пароль, он будет записан на ваш .bash_historyфайл bash_history и все усилия по его шифрованию разбиты вдребезги.
https://stackoverflow.com/questions/3318853/hide-encrypt-password-in-bash-file-to-stop-accidentally-seeing-it/41174250#comment90763501_41174250
Согласен, это не очень хорошая идея. Я думаю, что возможное решение состоит в том, чтобы поставить пробел перед командой, поэтому команда не записывается историей bash.
Alexander Nick

22.02.2018 01:09:09

Хотя это не встроенное решение Unix, я реализовал решение для этого, используя сценарий оболочки, который может быть включен в любой сценарий оболочки, который вы используете. Это можно использовать в установках, совместимых с POSIX. (sh, bash, ksh, zsh) полное описание доступно в репозитории github -> > https://github.com/plyint/encpass.sh это решение автоматически создаст ключ для вашего скрипта и сохранит ключ и пароль (или другие секреты) в скрытом каталоге под вашим пользователем (т. е. ~/.encpass).

В вашем скрипте вам просто нужно исходник encpass.sh а затем вызовите метод get_secret. Например:

#!/bin/sh
. encpass.sh
password=$(get_secret)

Вставка кода для encpass.sh для более легкой видимости:

#!/bin/sh
################################################################################
# Filename: encpass.sh
# Description: This script allows a user to encrypt a password (or any other
#              secret) at runtime and then use it, decrypted, within another
#              script. This prevents shoulder surfing passwords and avoids
#              storing the password in plain text, which could inadvertently
#              be sent to or discovered by an individual at a later date.
#
#              This script generates an AES 256 bit symmetric key for each
#              script (or user-defined label) that stores secrets.  This key
#              will then be used to encrypt all secrets for that script or
#              label.  encpass.sh sets up a directory (.encpass) under the
#              user's home directory where keys and secrets will be stored.
#
#              Subsequent calls to retrieve a secret will not prompt for a
#              secret to be entered as the file with the encrypted value
#              already exists.
#
# Author: Xan Nick
#
# Usage: . ./encpass.sh
#        ...
#        $password=$(get_secret)
################################################################################

checks() {
if [ -n "$ENCPASS_CHECKS" ]; then
return
fi

if [ ! -x "$(command -v openssl)" ]; then
echo "Error: OpenSSL is not installed or not accessible in the current path." \
"Please install it and try again." >&2
exit 1
fi

ENCPASS_HOME_DIR=$(get_abs_filename ~)/.encpass

if [ ! -d $ENCPASS_HOME_DIR ]; then
mkdir -m 700 $ENCPASS_HOME_DIR
mkdir -m 700 $ENCPASS_HOME_DIR/keys
mkdir -m 700 $ENCPASS_HOME_DIR/secrets
fi

if [ ! -z $1 ] && [ ! -z $2 ]; then
LABEL=$1
SECRET_NAME=$2
elif [ ! -z $1 ]; then
LABEL=$(basename $0)
SECRET_NAME=$1
else
LABEL=$(basename $0)
SECRET_NAME="password"
fi

ENCPASS_CHECKS=1
}

generate_private_key() {
KEY_DIR="$ENCPASS_HOME_DIR/keys/$LABEL"

if [ ! -d $KEY_DIR ]; then
mkdir -m 700 $KEY_DIR
fi

if [ ! -f $KEY_DIR/private.key ]; then
(umask 0377 && printf "%s" "$(openssl rand -hex 32)" > $KEY_DIR/private.key)
fi
}

get_private_key_abs_name() {
PRIVATE_KEY_ABS_NAME="$ENCPASS_HOME_DIR/keys/$LABEL/private.key"

if [ ! -f "$PRIVATE_KEY_ABS_NAME" ]; then
generate_private_key
fi
}

get_secret_abs_name() {
SECRET_ABS_NAME="$ENCPASS_HOME_DIR/secrets/$LABEL/$SECRET_NAME.enc"

if [ ! -f "$SECRET_ABS_NAME" ]; then
set_secret $1 $2
fi
}

get_secret() {
checks $1 $2
get_private_key_abs_name
get_secret_abs_name $1 $2

dd if=$SECRET_ABS_NAME ibs=1 skip=32 2> /dev/null | openssl enc -aes-256-cbc \
-d -a -iv $(head -c 32 $SECRET_ABS_NAME) -K $(cat $PRIVATE_KEY_ABS_NAME)
}

set_secret() {
checks $1 $2
get_private_key_abs_name
SECRET_DIR="$ENCPASS_HOME_DIR/secrets/$LABEL"

if [ ! -d $SECRET_DIR ]; then
mkdir -m 700 $SECRET_DIR
fi

echo "Enter $SECRET_NAME:" >&2
stty -echo
read -r SECRET
stty echo
echo "Confirm $SECRET_NAME:" >&2
stty -echo
read -r CSECRET
stty echo
if [ "$SECRET" = "$CSECRET" ]; then
printf "%s" "$(openssl rand -hex 16)" > \
$SECRET_DIR/$SECRET_NAME.enc

echo "$SECRET" | openssl enc -aes-256-cbc -e -a -iv \
$(cat $SECRET_DIR/$SECRET_NAME.enc) -K \
$(cat $ENCPASS_HOME_DIR/keys/$LABEL/private.key) 1>> \
$SECRET_DIR/$SECRET_NAME.enc
else
echo "Error: secrets do not match.  Please try again." >&2
exit 1
fi
}

get_abs_filename() {
# $1 : relative filename
filename=$1
parentdir=$(dirname "${filename}")

if [ -d "${filename}" ]; then
echo "$(cd "${filename}" && pwd)"
elif [ -d "${parentdir}" ]; then
echo "$(cd "${parentdir}" && pwd)/$(basename "${filename}")"
fi
}
Закрыть X