C에서 crypt 함수 사용
이 기사에서는 C에서crypt
기능을 사용하는 방법에 대한 몇 가지 방법을 설명합니다.
crypt
기능을 사용하여 스토리지 용 암호를 해시
crypt
는 실제로 시스템 또는 인증에 대한 저장을위한 암호 해싱 방법을 제공하는 네 가지 기능의 제품군입니다. 이러한 함수는 빠르고 적은 처리 능력을 사용하도록 설계된 범용 기능에 비해 암호 해싱이 계산적으로 비싸야하기 때문에 범용 암호화 해싱에 적합하지 않습니다.
crypt
는const
한정 매개 변수로 전달 된 두 개의char*
인수를 사용합니다. 첫 번째 인수는 해시해야하는 암호를 가리키고 두 번째 인수는 crypt_gensalt
함수를 사용하여 생성해야하는 setting
이라는 특수 문자열입니다. setting
인수는 사용할 해싱 알고리즘, 해시의 계산 비용 (더 비싼 값에 해당하는 더 큰 값) 및 임의의 솔트 바이트와 같은crypt
함수에 대한 여러 매개 변수를 제공합니다. 솔트에 대한 바이트는 암호 학적으로 임의적이어야하며 시스템 별 난수 생성 유틸리티에서 별도로 얻을 수 있습니다. 다음 예는 임의의 바이트 자동 검색을 나타내는 세 번째 매개 변수로 ‘crypt_gensalt’에 특수 값인 null 포인터가 전달되는 경우를 보여줍니다.
사용 가능한 여러 해시 알고리즘이 있으며 (이 페이지에 자세히 설명되어 있음), 고유 한 문자열 식별자로 crypt_gensalt
기능. crypt_gensalt
가setting
문자열을 반환하면 패스 프레이즈와 함께crypt
함수로 전달할 수 있으며 반환 값은 인쇄 가능한 ASCII 텍스트 인 해시 된 패스 프레이즈가됩니다. 다음 샘플 코드에서"$2b$"
접두사 문자열로 식별되는bcrypt
알고리즘을 사용합니다. crypt_gensalt
함수의 두 번째 인수는 주어진 알고리즘의 기본 레벨을 지정하는0
값으로 해시 생성에 드는 비용을 지정합니다. 이 경우bcrypt
해싱 알고리즘에 권장되는 값인15
를 지정합니다.
#include "crypt.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
enum { MAX_LEN = 1024 };
int main(int argc, char *argv[]) {
char *text, *encrypted, *salt;
size_t len;
long lnmax;
text = malloc(MAX_LEN);
printf("Input string to be hashed: ");
if (fgets(text, MAX_LEN, stdin) == NULL) exit(EXIT_FAILURE);
len = strlen(text);
if (text[len - 1] == '\n') text[len - 1] = '\0';
salt = crypt_gensalt("$2b$", 15, NULL, 0);
encrypted = crypt(text, salt);
printf("Encrypted: %s", encrypted);
free(text);
exit(EXIT_SUCCESS);
}
출력:
Input string to be hashed: hello there
Encrypted: $2b$15$DkpZq2vJRQoBiK4slxfFa.Eml8PUtFB7CYYH1RJH6XML3ujhX8fqy
crypt
기능의 성공적인 실행을 보장하기 위해 엄격한 오류 처리 루틴 사용
이전 예제 코드는 사용자로부터 입력 문자열을 가져와이를 저장할 동적 메모리를 할당합니다. 따라서stdio
버퍼에 남은 문자없이 문자열을 읽도록해야합니다. 이를 위해stdout
에서fflush
를 호출 한 다음fgets
를 호출하여 사용자로부터 입력 문자열을 가져옵니다. 또한 모든 라이브러리 함수와 시스템 호출에서 오류 반환 값을 확인하고perror
를 호출하여 해당 메시지를 출력하십시오.
#include "crypt.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
enum { MAX_LEN = 1024 };
int main(int argc, char *argv[]) {
char *text, *encrypted, *salt;
size_t len;
long lnmax;
text = malloc(MAX_LEN);
if (text == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
printf("Input string to be hashed: ");
fflush(stdout);
if (fgets(text, MAX_LEN, stdin) == NULL) exit(EXIT_FAILURE);
len = strlen(text);
if (text[len - 1] == '\n') text[len - 1] = '\0';
salt = crypt_gensalt("$2b$", 15, NULL, 0);
if (salt == NULL) {
perror("crypt_gensalt");
exit(EXIT_FAILURE);
}
encrypted = crypt(text, salt);
if (encrypted == NULL) {
perror("crypt_gensalt");
exit(EXIT_FAILURE);
}
printf("Encrypted: %s", encrypted);
free(text);
exit(EXIT_SUCCESS);
}
출력:
Input string to be hashed: hello there
Encrypted: $2b$15$DkpZq2vJRQoBiK4slxfFa.Eml8PUtFB7CYYH1RJH6XML3ujhX8fqy
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook