Есть ли стандартный способ создания соли для системного вызова crypt?

Мне нужно реализовать управление учетными записями для моего приложения, и я бы предпочел не использовать подпроцесс chpasswd или иным образом не позволять незашифрованному паролю из памяти моего приложения.

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

В противном случае, было бы разумно просто повторно использовать текущую соль, хранящуюся в моем теневом файле? Я не мог понять, почему это БУДЕТ представлять угрозу безопасности (это не ослабит мой теневой файл против атаки радужной таблицы), это просто кажется неправильным, потому что в системной безопасности эмпирическое правило состоит в том, чтобы всегда рандомизировать все... (Пользователи добавляются системными утилитами)


person immortal    schedule 03.08.2017    source источник
comment
Что вы подразумеваете под стандартом? Если вы имеете в виду POSIX, соль — это всего два случайных символа, но это будет означать шифрование DES — не очень хорошая идея. Собираетесь ли вы использовать glibc расширения crypt(), позволяющие, например. для шифрования SHA-256?   -  person    schedule 03.08.2017
comment
Не разумно повторно использовать соль наверняка. Кроме того, crypt не является системным вызовом, поэтому гипотетический new_salt тоже не является. Вы можете использовать getrandom в последнем Linuxen, чтобы получить случайные байты для соли, а затем замаскировать эти символы без знака с помощью & 63, сопоставить с [a-zA-Z0-9./] для соли.   -  person Antti Haapala    schedule 03.08.2017
comment
Спасибо вам обоим. Да, я имею в виду POSIX/стандартные библиотеки, включая glib. Да, конечно, я бы использовал SHA 512. Есть ли такая функция в любой стандартной библиотеке? Мы действительно должны каждый раз писать такую ​​функцию вручную?   -  person immortal    schedule 03.08.2017


Ответы (2)


OpenSSL предоставляет функции для sha512:

https://www.openssl.org/docs/man1.0.2/crypto/SHA512.html

int SHA256_Init(SHA256_CTX *c);
int SHA256_Update(SHA256_CTX *c, const void *data, size_t len);
int SHA256_Final(unsigned char *md, SHA256_CTX *c);
unsigned char *SHA256(const unsigned char *d, size_t n,
      unsigned char *md);
person user803422    schedule 03.08.2017
comment
Какая солевая часть? Или он автоматически интегрируется? - person immortal; 03.08.2017
comment
Я был введен в заблуждение вашим комментарием о SHA512. Я опубликовал еще один ответ о том, как создать соль. - person user803422; 04.08.2017

Для генерации соли для crypt() вам нужно 2 случайных байта. Для этого вы можете использовать openssl:

#include <openssl/rand.h>
int RAND_bytes(unsigned char *buf, int num);
int RAND_pseudo_bytes(unsigned char *buf, int num);

Ссылка: https://www.openssl.org/docs/man1.0.2/crypto/RAND_bytes.html

Пример:

unsigned char salt[2];
RAND_pseudo_bytes(salt, 2);
char *ptr = crypt(password, salt);
person user803422    schedule 04.08.2017
comment
Боюсь, этот код не даст желаемого результата... Соль — это строка в форме $6$salt$, где 6 означает SHA 512, а соль — это строка от 8 до 16 символов [a-zA-Z0-9./] - person immortal; 05.08.2017