C 프로그래밍

리눅스 C프로그래밍 23.12.13 프로그램 소스 코드

Nohsw 2023. 12. 13. 01:26
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <openssl/sha.h>

enum userInputNum {
	input_SignUp = 1,
	input_Login = 2,
	input_Exit = 4,
	input_Admin = 3
};

struct Member {
	char username[50];
	char password[50];
	char password_hash[50];
	char checkPassword[50];
};

struct Member members[100];
int memberCount = 0;

void clearInputBuffer() {
	int c;
	while((c = getchar()) != '\n' && c != EOF);
}

void signUp();
void login();
void displayMenu();
void userList();
//void hashPassword(const char *password, char *hashedPassword);


/*void hashPassword(const char *password, char *hashedPassword) {
	unsigned char hash[SHA256_DIGEST_LENGTH];
	SHA256_CTX sha256;
	SHA256_Init(&sha256);
	SHA256_Update(&sha256, password, strlen(password));
	SHA256_Final(hash, &sha256);

	for (int i; i < SHA256_DIGEST_LENGTH; i++) {
		sprintf(hashedPassword + (i * 2), "%02x", hash[i]);
	}

	hashedPassword[64] = '\0';
}*/

int main() {
	int choice;

	do {
		displayMenu();

		printf("숫자를 입력해주세요: ");
		scanf("%d", &choice);
		enum userInputNum UserInputNum = choice;
		clearInputBuffer();

		switch(UserInputNum) {
			case input_SignUp:
				signUp();
				break;

			case input_Login:
				login();
				break;

			case input_Exit:
				printf("프로그램을 종료합니다.");
				break;

			case input_Admin:
				userList();
				break;

			default:
			printf("default\n");
		}
		printf("\n\n");

	} while(choice != 4);

	return 0;
}

void signUp() {
	struct Member newMember;

	printf("아이디 입력: ");
	scanf("%s", newMember.username);

//	printf("비밀번호 입력: ");
//	scanf("%s", newMember.password);

	char *password = getpass("비밀번호 입력: \n");
	strncpy(newMember.password, password, sizeof(newMember.password) -1);
	newMember.password[sizeof(newMember.password) -1] = '\0';
//	hashPassword(password, newMember.password_hash);
//	printf("%s\n", newMember.password);

//	printf("password: %s", password);
//	printf("newMember.password: %s", newMember.password);

//	printf("비밀번호 한번 더 입력: ");
//	scanf("%s", newMember.checkPassword);
	char *checkPassword = getpass("비밀번호 한번 더 입력 \n");
	strncpy(newMember.checkPassword, checkPassword, sizeof(newMember.checkPassword) -1);
	newMember.checkPassword[sizeof(newMember.checkPassword)-1] = '\0';

//	printf("pass: %s\n newMemberPass: %s\n checkPass: %s\n newMemberCheckPass: %s\n", password, newMember.password, checkPassword, newMember.checkPassword);

	if(strcmp(newMember.password, newMember.checkPassword) == 0) {
		members[memberCount] = newMember;
		memberCount++;

		printf("회원가입 완료.\n");
		return;
	}

	printf("회원가입 실패.\n");
}

void login() {
	char username[50];
//	char password[50];
	int i;

	printf("아이디 입력: ");
	scanf("%s", username);

//	printf("비밀번호 입력: ");
//	scanf("%s", password);
	char *password = getpass("비밀번호 입력: \n");

	for (i = 0; i < memberCount; i++) {
		if(strcmp(username, members[i].username) == 0 && strcmp(password, members[i].password) == 0) {
			printf("로그인 성공\n");
			return;
		}
	}

	printf("로그인 실패\n");
}

void displayMenu() {
	printf("\n메뉴\n");
	printf("1. 회원가입\n");
	printf("2. 로그인\n");
	printf("3. 회원 목록 보기\n");
	printf("4. 종료\n");
}

void userList() {
	puts("회원목록은 관리자만 확인할 수 있습니다.\n");
	char *password = getpass("관리자 비밀번호 입력: ");
	if (strcmp(password, "admin") == 0) {
		printf("\n--회원 목록--\n");
		for (int i = 0; i < memberCount; i++) {
			printf("%d. %s\n", i + 1, members[i].username);
		}
		printf("------------\n");
	} else {
		printf("관리자 비밀번호가 다릅니다.\n");
	}
}

암호화 관련은 오류가 있어 파악 후 다시 작성해보도록 해야겠다.