2010-10-12 4 views
2

J'ai besoin d'une commande ou d'un script pour retourner les algorithmes de hachage supportés (pour hacher les mots de passe) sur un système, des algorithmes peuvent être utilisés avec les fichiers de configuration pam.d ou login.defs.retour des algorithmes de hachage pris en charge

généralement md5, bigcrypt, sha256, sha512 et blowfish sont supportés mais j'ai besoin de vérifier par programme si un nouvel algorithme est supporté et de le déterminer dans mon script.i vérifié/proc/crypto mais est trop inférieur à ce que j'ai mentionné

grâce

Répondre

2

/proc/crypto est juste une liste des algorithmes que le noyau a connaissance; cela n'a rien à voir avec PAM.

Il n'existe aucun moyen d'interroger directement PAM pour savoir quels hachages il peut supporter; il le sait en interne, bien sûr, mais il n'est exposé par aucune API publique. Une chose que vous pouvez faire est d'utiliser crypt et tenter de hacher un passe avec les différents types d'id, en sondant essentiellement PAM (ou plus exactement, en explorant la crypt de libc, que PAM utilise pour les mots de passe ombrés). Exemple simple:

#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"); 
    } 
Questions connexes