2017-12-15 13 views
0

パスフレーズから確定的に公開鍵/秘密鍵のペアをlibsodiumで生成したいとします。 ユーザが/パスフレーズを入力するたびに、同じキーペアを取得します。libsodiumのパスフレーズから鍵ペアを生成する

私のアプローチは、何らかの形で(例えば、fgets)パスフレーズを取得crypto_generichashでそれをハッシュし、その後crypto_sign_seed_keypairにシードとしてハッシュを使用している:パスフレーズが強いと仮定

#include <assert.h> 
#include <string.h> 
#include <sodium.h> 

int main (void) { 
    char passphrase[1024]; 
    printf("ENTER PASSPHRASE: "); 
    { 
     char* ret = fgets(passphrase, sizeof(passphrase), stdin); 
     assert(ret != NULL); 
     assert(passphrase[strlen(passphrase)-1] == '\n'); 
     passphrase[strlen(passphrase)-1] = '\0'; 
    } 

    unsigned char hash[crypto_generichash_BYTES]; 
    { 
     int ret = crypto_generichash(hash, crypto_generichash_BYTES, 
            (unsigned char*)passphrase, strlen(passphrase), 
            NULL, 0); 
     assert(ret == 0); 
    } 

    unsigned char pk[crypto_sign_PUBLICKEYBYTES]; 
    unsigned char sk[crypto_sign_SECRETKEYBYTES]; 
    { 
     assert(crypto_generichash_BYTES == crypto_sign_SEEDBYTES); 
     int ret = crypto_sign_seed_keypair(pk, sk, hash); 
     assert(ret == 0); 
    } 
    printf("PUBLIC KEY:\n"); 
    for (int i=0; i<crypto_sign_PUBLICKEYBYTES; i++) { 
     printf("%02X ", pk[i]); 
    } 
    printf("\n"); 
    printf("PRIVATE KEY:\n"); 
    for (int i=0; i<crypto_sign_SECRETKEYBYTES; i++) { 
     printf("%02X ", sk[i]); 
    } 
    printf("\n"); 

    return 0; 
} 

、このスキームであります安全で実用的?

答えて

0

あなたのコードは問題ありませんが、「強力な」パスフレーズでさえもかなり低いエントロピーがあります。したがって、一般的なハッシュ関数の代わりにpassword hashing functionを使用することができます。

+0

私の場合、ユーザーは塩分を知ることができないので、固定値を使用するだけですか? (ハッシュ/ソルトはどこにも格納されません)。これは一般的なハッシュよりもずっと優れていますか? – fsantanna

+0

固定塩がいいです。アプリケーション固有のものに設定することができます。 –

関連する問題