2017-12-15 15 views
0

libsodium이라는 암호로 공개 키/비밀 키 쌍을 결정적으로 생성하고 싶습니다. 사용자가 암호 구문을 입력 할 때마다 언제나 동일한 키 쌍을 가져옵니다.libsodium의 암호문에서 키 쌍 생성하기

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

를 암호가 강한 가정 할 때,이 제도입니다 :

내 접근 방식 (예를 들어, fgets가), crypto_sign_seed_keypair에 씨앗으로 해시를 사용하여 다음 crypto_generichash로 해시, 어떻게 든 암호를 획득하는 것입니다 안전하고 실용적인?

답변

0

코드는 괜찮지 만 "강력한"암호문도 엔트로피가 매우 낮습니다. 따라서 일반 해시 함수 대신 password hashing function을 사용할 수 있습니다.

+0

내 경우에는 사용자가 소금을 찾을 수 없으므로 고정 값을 사용해야합니까? (해시/소금은 아무 곳에도 저장되지 않습니다.) 일반 해시보다 여전히 훨씬 좋은가요? – fsantanna

+0

고정 된 소금이 좋습니다. 응용 프로그램에 고유 한 것으로 설정할 수 있습니다. –