Требуется хранить пароль в базе — как?

Задача слегка нетривиальная, проект требует хранить на своей стороне пароль пользователя от определённого ресурса (т.к. ресурс не имеет API, и нам надо хранить credentials пользователя, чтобы вытаскивать с него постоянно информацию).
Вопрос, как это лучше делать, чтобы хотя бы не совсем в открытом виде? Как-то шифровать в БД, а ключ класть отдельно?
Спасибо.
  • Вопрос задан
  • 4211 просмотров
Решения вопроса 2
Denormalization
@Denormalization
Все варианты выше: не дают приемлемой защиты от кражи данных. Получив доступ к серверу, я смогу без проблем получить доступ ко всем паролям которые хранятся в "открытом" виде.

Правильный вариант:
Поднять на внешнем сервере свой API, на который будут скидываться открытые логин\пароль пользователей. Контакты с этим сервером только через API, на уровне: сохрани данные, начни работу, верни статус работы, обнови данные.

Тогда даже если я получу доступ к основному серверу, я физически не смогу достать открытые пароли пользователей. Максимум что я смогу - навредить, удалив эти данные. Но это я могу сделать и на основном сервере.
Ответ написан
Stalker_RED
@Stalker_RED
Да, как-то шифровать, и ключ хранить отдельно. Можно еще соль добавить.

mcrypt или OpenSSL

Можно создать пару ключей, шифровать публичным ключом, а расшифровывать личным. Запуск крона из-по-другого ползователя, и доступ к ключу только у него. Таким образом, если злоумышленник добрался до базы - ключа у него нет. Если залил шеллскрипт и работает под www-data - тоже ключа нет. Точнее есть публичный, для зашифровки, но ключ для расшифровки под другим юзером. Но, конечно, если доберется до рута - всё.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Androguide
@Androguide
TeamLead AG
deemytch
@deemytch
linux root, ruby/perl programmer, sql, backend.
Вариант решения: шифруйте все данные для доступа к третьему ресурсу с помощью пароля пользователя для доступа к вашему сайту, а сам пароль в базе не храните.
При авторизации расшифровываем данные и кладём во временное хранилище в памяти.
Ответ написан
@BorisIvanov
можно шифровать пароли следующим образом
CREATE OR REPLACE FUNCTION el_encrypt
(
	value text
)
RETURNS bytea
AS $BODY$
BEGIN
	RETURN pgp_pub_encrypt(value, dearmor(pg_read_file('pgpkeys/pgp-pg-el-public.key')));  
END;
$BODY$ LANGUAGE plpgsql
SECURITY DEFINER;


расшифровывать

CREATE OR REPLACE FUNCTION el_decrypt
(
	value bytea
) RETURNS text AS 
$BODY$
BEGIN
 RETURN pgp_pub_decrypt(value, dearmor(pg_read_file('pgpkeys/pgp-pg-el-private.key')));
END;
$BODY$
LANGUAGE plpgsql
SECURITY DEFINER;


при получении дампа базы, данные не возможно прочесть без ключей, ключи хранятся в файловой системе. это достаточно простой и относительно защищенный вариант хранения. как генерить ключи есть в описании postgresql
Ответ написан
Комментировать
akzhan
@akzhan
Не держать в базе, а держать в конфиге, который доступен только боевым серверам.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы