2010-10-12 114 views
2

我需要一個命令或腳本返回系統上支持的哈希算法(對於哈希密碼),我的意思是算法可以與pam.d配置文件或login.defs一起使用。返回支持哈希算法

一般MD5,bigcrypt,sha256,sha512和河豚都支持,但我需要以編程方式檢查是否支持新算法,並確定它在我的script.i checked/proc/crypto,但是比我之前提到的太少

感謝

回答

2

/proc/crypto只是一個內核知道的算法列表;這與PAM無關。

有沒有辦法直接查詢PAM找出它可以支持的哈希值;它當然知道這是內部的,但它不會被任何公共API暴露。

你可以做的一件事就是使用crypt並嘗試使用各種id類型散列pass,本質上是探測PAM(或者更恰當地說,探測libc的crypt,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"); 
    }