2012-04-09 3 views
0

좋아, 나는 이것을 연구하는 지난 며칠을 보냈다. 아파치가 기본적으로 지원하는 해싱 기능이 오래되었다는 것을 믿을 수 없다.Apache에서 SHA-2 인증을 사용할 수 있습니까?

mod_perl과 mod_authnz_external 인 두 가지 방법을 발견했습니다. 두 가지 방법 모두 너무 느립니다. 보호 된 디렉토리의 객체가 호출 될 때마다 아파치가 실행되기 때문입니다. 즉, 사용자는 단일 세션에서 수백 번 인증을 받아야 할 수 있습니다.

Apache에서 인증을 이동하지 않고 MD5 및 SHA-1보다 안전한 보안 기능을 사용하는 사람이 있습니까? 소금에 절인 SHA-2는 정말 보너스가 될 것입니다.

감사합니다.

답변

3

지난 5 년 간 출시 된 glibc2 버전의 GNU/Linux 시스템을 사용하는 경우 htpasswd의 crypt() 구현을 수정하여 소금에 "$ 6 $"을 추가 한 다음 ' 처럼 간단 할 D :

# htpasswd -d -c .htpasswd someusername 

가 염 "$ 6 명 $"로 시작하면,이 glibc2는 사용 소금 SHA-512은 최대 16 개 문자로 그 범위는 [A-ZA에서 염 후의 -Z0-9./].

남성 3 암호를 참조하십시오.

나는 이것을 지원할 패치를 모르지만 간단한 패치 여야합니다.

EDIT : 침입자가 충분히 결정되면 소금에 절인 SHA-512조차도 파괴 될 수 있음을 말씀드립니다. 나는 권하고, HMAC-SHA512와 함께 PBKDF2의 128000 라운드를 편집 할 수 있었던 대부분의 것들을 사용하고 있지만, PKCS5_PBKDF2_HMAC가있는 openssl에 대해 htpasswd를 연결하지 않는 한 매우 광범위한 편집이 될 것입니다.() 함수를 호출합니다.

편집 2 : 당신이 관심이 있다면 또한, 강력한 해싱을 할 수있는 OpenSSL을 사용하는 하드되지 않습니다 : 내 컴퓨터 (우분투 16.04)에

abraxas ~ # cat pbkdf2.c 

#include <string.h> 
#include <stdio.h> 
#include <openssl/evp.h> 
#include <openssl/sha.h> 

#define PBKDF2_SALT_PREFIX   "$pbkdf2sha512$" 
#define PBKDF2_SALT_PREFIX_LENGTH strlen(PBKDF2_SALT_PREFIX) 
#define PBKDF2_PRF_ALGORITHM  EVP_sha512() 
#define PBKDF2_DIGEST_LENGTH  SHA512_DIGEST_LENGTH 
#define PBKDF2_SALT_LENGTH   32 
#define PBKDF2_RESULT_LENGTH  PBKDF2_SALT_PREFIX_LENGTH + (2 * PBKDF2_DIGEST_LENGTH) + PBKDF2_SALT_LENGTH + 2 
#define PBKDF2_ROUNDS    128000 

void hash_password(const char* pass, const unsigned char* salt, char* result) 
{ 
    unsigned int i; 
    static unsigned char digest[PBKDF2_DIGEST_LENGTH]; 
    memcpy(result, PBKDF2_SALT_PREFIX, PBKDF2_SALT_PREFIX_LENGTH); 
    memcpy(result + PBKDF2_SALT_PREFIX_LENGTH, salt, PBKDF2_SALT_LENGTH); 
    result[PBKDF2_SALT_PREFIX_LENGTH + PBKDF2_SALT_LENGTH] = '$'; 
    PKCS5_PBKDF2_HMAC(pass, strlen(pass), salt, PBKDF2_SALT_LENGTH, PBKDF2_ROUNDS, PBKDF2_PRF_ALGORITHM, PBKDF2_DIGEST_LENGTH, digest); 
    for (i = 0; i < sizeof(digest); i++) 
     sprintf(result + PBKDF2_SALT_PREFIX_LENGTH + PBKDF2_SALT_LENGTH + 1 + (i * 2), "%02x", 255 & digest[i]); 
} 

int main(void) 
{ 
    char result[PBKDF2_RESULT_LENGTH]; 
    char pass[] = "password"; 
    unsigned char salt[] = "178556d2988b6f833f239cd69bc07ed3"; 
    printf("Computing PBKDF2(HMAC-SHA512, '%s', '%s', %d, %d) ...\n", pass, salt, PBKDF2_ROUNDS, PBKDF2_DIGEST_LENGTH); 
    memset(result, 0, PBKDF2_RESULT_LENGTH); 
    hash_password(pass, salt, result); 
    printf("Result: %s\n", result); 
    return 0; 
} 

abraxas ~ # gcc -Wall -Wextra -O3 -lssl pbkdf2.c -o pbkdf2 
abraxas ~ # time ./pbkdf2 

Computing PBKDF2(HMAC-SHA512, 'password', '178556d2988b6f833f239cd69bc07ed3', 128000, 64) ... 
Result: $pbkdf2sha512$178556d2988b6f833f239cd69bc07ed3$3acb79896ce3e623c3fac32f91d4421fe360fcdacfb96ee3460902beac26807d28aca4ed01394de2ea37b363ab86ba448286eaf21e1d5b316149c0b9886741a7 

real 0m0.320s 
user 0m0.319s 
sys 0m0.001s 

abraxas ~ # 
+0

, 나는'의 libssl-dev'를 설치했다, 명백하게. 그런 다음 다른 컴파일 명령을 사용하여 성공적으로 빌드해야했습니다 :'gcc -Wall -Wextra -O3 pbkdf2.c -o pbkdf2 -lcrypto' –

관련 문제