2012-04-09 8 views
0

さて、これを研究していたこの2、3日を費やして、Apacheのネイティブにサポートされているハッシュ関数が古くなっているとは思えません。ApacheでのSHA-2認証の高速化も可能ですか?

mod_perlとmod_authnz_externalの2つの方法がありますが、どちらも遅すぎます。なぜなら、保護されたディレクトリ内のオブジェクトが呼び出されるたびにApacheが実行するためです。つまり、ユーザーは1回のセッションで数百回の認証を受ける必要があります。

ApacheからMD5とSHA-1よりも安全性の高いものを使用するようになったことがありますか?塩漬けされたSHA-2は本当のボーナスになります。

ありがとうございます!

答えて

3

最近5年以内にリリースされたglibc2のバージョンを使用しているGNU/Linuxシステムを使用している場合は、htpasswdのcrypt()実装を修正して "$ 6 $"を塩に付けることができます。

# htpasswd -d -c .htpasswd someusername 

塩「は、$ 6 $」で始まる場合、glibc2では-ZA [範囲内、すなわち塩された後の16文字までで、塩漬けSHA-512を使用します。ように単純であるdは-Z0-9./]。

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

私はこれをサポートするパッチは認識していませんが、単純なものでなければなりません。

EDIT:あなたの攻撃者が十分に決まっていれば、塩漬けされたSHA-512でも1ラウンドも壊れやすいと言いたいと思います。 HMAC-SHA512でPBKDF2の128000ラウンドを編集することができましたが、これは非常に広範な編集になります。もしhspasswdをopensslとリンクさせたい場合は、PKCS5_PBKDF2_HMAC () 関数。

EDIT 2:あなたが興味を持っている場合にも、強いハッシュを行うためにOpenSSLを使用することは、難しいことではありません。私のマシン(Ubuntuの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' –

関連する問題