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?
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
Ein fixiertes Salz ist in Ordnung. Sie können es auf etwas einzigartig für Ihre Anwendung einstellen. –