2017-12-15 3 views
0

Ich möchte ein öffentliches/privates Schlüsselpaar deterministisch aus einer Passphrase mit libsodium generieren. Wann/wo immer der Benutzer seine Passphrase eingibt, bekommt er das gleiche Schlüsselpaar zurück.Generating Schlüsselpaar aus Passphrase in libsodium

Mein Ansatz ist das Passwort irgendwie (zB fgets), hash es mit crypto_generichash, und verwenden Sie dann den Hash als Keim zu crypto_sign_seed_keypair zu erwerben:

#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; 
} 

Unter der Annahme, das Passwort stark ist, ist dieses Schema sicher und praktisch?

Antwort

0

Ihr Code ist in Ordnung, aber selbst eine "starke" Passphrase hat eine ziemlich niedrige Entropie. Daher sollten Sie statt einer generischen Hash-Funktion eine password hashing function verwenden.

+0

In meinem Fall, da der Benutzer nicht in der Lage sein würde, das Salz herauszufinden, sollte ich nur einen festen Wert verwenden? (Das Hash/Salz wird nirgends gespeichert.) Ist es immer noch viel besser als ein generischer Hash? – fsantanna

+0

Ein fixiertes Salz ist in Ordnung. Sie können es auf etwas einzigartig für Ihre Anwendung einstellen. –