C에서 crypt 함수 사용

Jinku Hu 2023년10월12일
  1. crypt기능을 사용하여 스토리지 용 암호를 해시
  2. crypt기능의 성공적인 실행을 보장하기 위해 엄격한 오류 처리 루틴 사용
C에서 crypt 함수 사용

이 기사에서는 C에서crypt기능을 사용하는 방법에 대한 몇 가지 방법을 설명합니다.

crypt기능을 사용하여 스토리지 용 암호를 해시

crypt는 실제로 시스템 또는 인증에 대한 저장을위한 암호 해싱 방법을 제공하는 네 가지 기능의 제품군입니다. 이러한 함수는 빠르고 적은 처리 능력을 사용하도록 설계된 범용 기능에 비해 암호 해싱이 계산적으로 비싸야하기 때문에 범용 암호화 해싱에 적합하지 않습니다.

cryptconst 한정 매개 변수로 전달 된 두 개의char*인수를 사용합니다. 첫 번째 인수는 해시해야하는 암호를 가리키고 두 번째 인수는 crypt_gensalt함수를 사용하여 생성해야하는 setting이라는 특수 문자열입니다. setting 인수는 사용할 해싱 알고리즘, 해시의 계산 비용 (더 비싼 값에 해당하는 더 큰 값) 및 임의의 솔트 바이트와 같은crypt 함수에 대한 여러 매개 변수를 제공합니다. 솔트에 대한 바이트는 암호 학적으로 임의적이어야하며 시스템 별 난수 생성 유틸리티에서 별도로 얻을 수 있습니다. 다음 예는 임의의 바이트 자동 검색을 나타내는 세 번째 매개 변수로 ‘crypt_gensalt’에 특수 값인 null 포인터가 전달되는 경우를 보여줍니다.

사용 가능한 여러 해시 알고리즘이 있으며 (이 페이지에 자세히 설명되어 있음), 고유 한 문자열 식별자로 crypt_gensalt기능. crypt_gensaltsetting문자열을 반환하면 패스 프레이즈와 함께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
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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