вернуть поддерживаемые алгоритмы хеширования - PullRequest
2 голосов
/ 12 октября 2010

Мне нужна команда или скрипт, возвращающий поддерживаемые алгоритмы хеширования (для хеширования паролей) в системе, я имею в виду, что алгоритмы можно использовать с файлами конфигурации pam.d или login.defs.

обычно поддерживаются md5, bigcrypt, sha256, sha512 и blowfish, но мне нужно программно проверить, поддерживается ли новый алгоритм, и определить его в моем script.i проверил / proc / crypto, но он был меньше, чем я упоминал ранее

спасибо

1 Ответ

2 голосов
/ 12 октября 2010

/proc/crypto - это просто список алгоритмов, о которых знает ядро; это не имеет ничего общего с PAM.

Нет способа напрямую запросить PAM, чтобы выяснить, какие хеши он может поддерживать; конечно, он знает это внутренне, но не доступен ни одному общедоступному API.

Одна вещь, которую вы могли бы сделать, это использовать crypt и попытаться хэшировать проход с различными типами идентификаторов, по существу, проверяя PAM (или, точнее, проверяя крипту libc, которую PAM использует для теневых паролей). Простой пример:

#include <unistd.h>
#include <stdio.h>
#include <string>

bool test_crypt_method(const char* id)
   {
   const std::string salt =
      std::string("$") + id + "$" + "testsalt$";

   std::string crypt_result = ::crypt("password", salt.c_str());

   /*
   * If the hash ID is not supported, glibc unfortunately
   * then treats it as a old-style DES crypt rather than
   * failing; find this situation.
   */
   if(crypt_result.size() == 13 &&
      crypt_result[0] == '$' &&
      crypt_result.find('$', 1) == std::string::npos)
      return false;

   return true;
   }

int main()
   {
   if(test_crypt_method("1"))
      printf("md5 ");
   if(test_crypt_method("2a"))
      printf("blowfish ");
   if(test_crypt_method("4")) // test for false positives
      printf("undefined ");
   if(test_crypt_method("5"))
      printf("sha256 ");
   if(test_crypt_method("6"))
      printf("sha512 ");
   printf("\n");
   }
...