1. DB생성 및 접속
*실습환경: Ubuntu
MariaDB-server 및 MariaDB-client 설치
mariaDB에 접속하기 위해서는 클라이언트가 설치되어 있어야 한다
sudo apt install -y mariadb-server mariadb-client
vi 편집기를 최신 버전으로 설치
sudo apt install vim
MariaDB의 보안을 강화하는 설정
mysql_secure_installation
mysql_secure_installation명령어를 알고 계시나요?
mysql 기본 보안 명령어이다. mysql 초기 설치나 재설치 후에 기본적으로 보안 적용할 수 있는 명령어이지만, 이 명령어를 실행하시는 분을 거의 못 봤다ㅎ 사용법을 한번 살펴 보자. # ./bin/mysql_secur
absorbed.tistory.com
DB생성, Table생성, Insert수행 등의 작업이 담겨져있는 샘플데이터베이스 파일을 다운로드
(다운로드 위치는 '/home/사용자명' 으로 설정)
sudo wget http://sp.mysqltutorial.org/wp-content/uploads/2018/03/mysqlsampledatabase.zip
샘플데이터베이스 파일 압축 해제
sudo unzip mysqlsampledatabase.zip
DB접속
(패스워드는 "mysql_secure_installation"단계에서 설정했던 루트 패스워드 입력)
mysql -u root -p
샘플데이터베이스 파일에 있는 SQL을 실행하기
소스 위치는 DB접속 전 mysqlsampledatabase.sql(mysqlsampledatabase.zip 압축 해제 한 파일)이 있는 곳
source 명령어를 실행하면 "classicmodels" 라는 DB가 생성된 걸 확인할 수 있다
source /home/사용자명/mysqlsampledatabase.sql
이처럼 작성된 데이터베이스 파일을 이용하여 데이터베이스를 생성하는 방법도 있고 아래와 같이 직접 생성할 수도 있다
DB생성
users 테이블을 작성할 user_db 생성
CREATE DATABASE user_db
테이블 생성
users 테이블에는 사용자들의 ID, 비밀번호, 이름이 저장된다
create table users(
id varchar(20),
passwd varchar(20),
name varchar(20)
);
데이터 삽입(비밀번호 노출 위험)
insert into users values ('Man', '1234', 'Tom');
users 테이블을 조회하면 아까 입력했던 정보들이 그대로 노출된다
비밀번호를 저장할 때는 평문으로 저장해서는 안되면 "password()" 를 이용하여 암호화시켜서 저장해야한다
PASSWORD() 함수는 해시값을 계산한 문자열을 반환하는 함수로 데이터들을 암호화 해준다
2. 비밀번호 암호화
비밀번호 암호화를 하기 전에 단방향(일방향)암호화와 해쉬함수/해쉬값에 대해 알고 있어야한다
비밀번호 암호화에 쓰이는 방법은 해싱을 이용한 암호화 기법으로 암호화를 한 후 복호화할 필요가 없어
단방향 암호화라고 한다. 단방향 암호화의 종류에는 "MD5", "SHA1", "SHA2" 등이 있다
(MD5는 매우 취약하여 SHA2부터 사용 권장)
*해싱: 가변 크기의 입력값에서 고정된 크기의 출력값을 생성해 내는 과정으로 해시 함수(해싱 알고리즘으로 구현됨)에 의해 진행된다
해쉬 함수는 원문(파일,텍스트)을 해쉬함수에 넣으면 해쉬값(hash code)이 출력되는 알고리즘이다.
해쉬값은 16진수로 표현되는 문자열로 2진수 4자리를 16진수 1자리로 표현한다. SHA1은 128bit로 2진수 4자리(4bit)당 16진수 1자리이기 때문에 128/4 = 32(자리), SHA2는 256bit로 256/4 = 64(자리)가 나온다.
해쉬함수의 특징으로는
1) 원문(동영상, 문서, 이미지)의 길이와 관계없이 항상 고정된 길이로 출력되고, 해쉬값이 노출되더라도 원문을 알 수 없지만, 너무 짧은 길이의 해쉬함수를 사용하면 충돌쌍을 발견할 가능성이 높아진다.
*충돌쌍: 원문은 다른데 해쉬값이 같은 경우를 뜻하는데 이러한 충돌쌍이 발생하면 나와 비밀번호가 다른 사람의 해쉬값이 나와 같기 때문에 그 사람의 비밀번호를 알 수 있게 되어 안전성에 문제가 생긴다. 현재 MD5, SHA1은 충돌쌍이 발견되었기 때문에 사용하지 않는 것이 좋다.
2) 일방향 함수로서 해쉬함수와 해쉬값을 알아도 원문으로 복구를 할 수 없다 (역연산 불가능)
3) 원문이 조그만 달라져도 해쉬값이 달라지기 때문에 원문 해쉬값과 수정된 원문의 해쉬값을 비교하여 원문의 무결성을 검증할 수 있다
*무결성: 데이터의 정확성과 일관성을 유지하는 것으로 원문이 변경되지 않았다는 것을 확인하는 것
여기서 만약 나와 같은 비밀번호를 가진 다른 사람의 해쉬값도 같아서 안전성에 문제가 생길 수 있지 않냐고 물을 것이다. 그래서 SHA 방식만 사용하여 암호화를 하는 것보다 salt를 추가하는 방식이 주로 사용되고 있다. salt란 SHA 알고리즘 방식에 어떤 데이터(의미없는 임의의 문자 또는 숫자)를 추가하여 조합하는 것이다. Rainbow Table로 원래 값을 확인할 수 없도록 보안성을 높이는 방식이다.
*Rainbow Table (해시 함수를 사용하여 변환 가능한 모든 해시 값을 저장시켜 놓은 표)
이제 password() 함수를 이용하여 비밀번호 암호화를 해보자
컬럼에 대해 데이터 길이가 너무 길다는 에러 메세지가 발생한다
이는 password()의 연산 결과가 varchar(20)을 초과하기 때문이다
passwd 칼럼의 길이를 늘려준다
alter table users modify column passwd varchar(300);
password()로 저장한 비밀번호는 40자리 문자열로 변환되어 있는 걸 볼 수 있다
*SHA1인데 32자리가 아닌 40자리인 이유는 password() 함수는 SHA-1 알고리즘을 두 번 거쳐서 앞에 *를 붙이기 때문이다
password()는 SHA1(160bit)으로 보안이 취약하기 때문에 SHA2(256bit) 사용을 권장한다
하지만 SHA2라도 쉬운 패스워드를 사용한다면 쉽게 크래킹될 수 있다는 점을 유의해야 한다
패스워드를 저장할 때는 대/소/숫/특 섞어서 12자리 이상으로 설정해야 안전하다
SHA2 방식을 이용하여 암호화한 모습이다.
총 64자리의 해쉬값으로 이루어져있고 SHA1보다 더 안전하다.