0

わかりました、私はこれを調査するためにここ数日を費やしましたが、Apache がネイティブでサポートしているハッシュ関数がそれほど時代遅れであるとは信じられません。

mod_perl と mod_authnz_external でこれを行う方法をいくつか発見しましたが、どちらも遅すぎます。保護されたディレクトリ内のオブジェクトが呼び出されるたびに apache が実行されるためです。つまり、ユーザーは 1 回のセッションで何百回も認証を受ける必要がある場合があります。

認証を Apache から遠ざけることなく、MD5 や SHA-1 よりも安全なものを Apache に使用させることができた人はいますか? ソルトされた SHA-2 は本当におまけです。

ありがとう!

4

1 に答える 1

3

過去 5 年間にリリースされたバージョンの glibc2 を使用している GNU/Linux システムを使用している場合は、htpasswd の crypt() 実装を変更して、ソルトの先頭に「$6$」を追加すると、次のように簡単になります。なので:

 # htpasswd -d -c .htpasswd someusername

ソルトが「$6$」で始まる場合、glibc2 はソルトされた SHA-512 を使用し、その後の最大 16 文字が [a-zA-Z0-9./] の範囲のソルトになります。

man 3 crypt を参照してください。

これをサポートするパッチは知りませんが、単純なものである必要があります。

編集:攻撃者が十分に決定されている場合、ソルトされた SHA-512 の 1 ラウンドでも解読可能であることにも言及したいと思います。HMAC-SHA512 を使用した 128000 ラウンドの PBKDF2 を編集することをお勧めしますが、これは非常に広範な編集になります。 () 関数。

EDIT 2:また、興味があれば、opensslを使用して強力なハッシュを行うことは難しくありません:

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 ~ # 
于 2012-06-15T01:36:32.807 に答える