수업 정리 bbs-basic/#3(우편번호 등록, Spring boot 메일 보내기, 단방향 암호화)

최동민·2022년 6월 14일
0

Spring 수업정리

목록 보기
22/47

우편번호 등록

console 에서 DB COLUMN 추가

UserEntity에서 추가한 DB 필드 게터세터까지 생성

register.html 수정

js에서 addressSearchButton 추가

구글에 카카오 주소 API입력

script에 입력 후 option + enter로 라이브러리 다운로드.

그리고 아래 코드 입력

주소찾기 버튼 클릭하면 뜬다.


form 태그 바깥에 id와 class 생성


css 추가

const 추가


Spring boot 메일 보내기

의존성 추가

구글 로그인 후 2단계 인증과 앱 비밀번호를 받자

application.properties 에서
메일을 발송해주는 메일 서버(SMTP Server)

enum UserRegisterResult 생성

IResult 인터페이스 생성

UserRegisterVo 생성

UserService에서
우편번호, 기본주소, 이메일, 닉네임, 패스워드의 정규식을 정적 메소드로 만들어준다.
전달받은 값들에 대해 한번 더 정규화 체크 -> ILLEGAL 체크인 것.
(불법 접근 차단)
여기서도 정규화가 되지 않았다는 것은 js를 우회해서 왔다는 것이기 때문에. 고로 차단대상으로 지정한다.

정규식을 적던 것을 지우고 정적 메소드를 불러와주면 됨.

여기서 정규식을 한번 더 사용하기 때문에 중복 코드를 쓰기보다 정규식을 담은 정적메소드를 만들어 간단하게 코드를 줄인다.

UserController

IUserMapper

UserMapper.xml 에서 insert 작성
resultType을 적지 않는다. 밑은 셀렉트를 해서 반환되는 타입을 명시하는 것이고, int는 인서트 결과값이 알아서 int로 나갈 것이다.

utils 패키지 생성 후 CryptoUtil 클래스 추가

UserService 에서 추가

UserController에서 호출

회원가입 해보면 DB로 넘어간다

email_verified_flag
이메일 인증이 완료되었는가에 대한 여부


암호화

데이터베이스 관리자가 DB에 저장된 사용자의 개인 정보를 볼 수 있는 위험성이 있음
암호화해서 저장해야 함

  • 단방향성 암호화

    암호화 후, 복호화 못 함

  • MD5

    글자를 64 크기나 128 크기 글자로 암호화함
    크기가 제한되어 있기 때문에 다른 글자가 같은 글자로 암호화되어 중복될 가능성 있음

  • SHA-256, SHA-512 등

SHA-2(Secure Hash Algorithm 2)는 해시 알고리즘입니다.

여기서 해시 알고리즘은 값를 입력받아, 고정된 길이의 해시값을 출력하는 알고리즘입니다.

암호 알고리즘에는 키가 사용되지만, 해시 알고리즘 함수는 키를 사용하지 않습니다. 그래서 같은 입력에 대해 항상 같은 출력이 나오게 됩니다.

해시 알고리즘 함수를 사용하는 이유는 동일한 값인지 살피거나, 변조를 탐지할 수 있는 무결성을 갖기 위함입니다.

해시함수가 출력하는 압축된 문장을 다이제스트(Digest) 라고 합니다.

SHA-2가 생성하는 Digest 출력 길이는 224, 256, 384, 512bit입니다.

SHA-2의 256bit 버전을 SHA-256로, SHA-2의 512bit 버전을 SHA-512로 줄여 부릅니다.

현재 SHA-256은 "Collision attack" 공격에 41~64 라운드(Round)를 통과하면 공격에 안전한 것으로 간주하고,
SHA-512는 46~80 라운드를 통과해야 공격으로부터 안전한 것으로 판단합니다.

SHA2 256 암호화 과정

// 해싱에 사용할 값
String mixPassword = hexSaltTime + password;

// 해싱을 하기 위해서는 MessageDigest Class를 사용합니다.
// MessageDigest Algorithm은 MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512 을 사용가능합니다.
// 여기서는 SHA-256 Algorithm을 사용합니다.
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");

// 값을 해싱하기 전에 reset을 통해서 해싱 인스턴스를 초기화합니다.
messageDigest.reset();

// utf8 character set으로 해싱에 사용할 값을 바이트코드로 변환하여 해싱 인스턴스에 업데이트합니다.
messageDigest.update(mixPassword.getBytes("utf8"));

// 위 과정에서 셋팅된 값을 최종적으로 digest() 함수를 통해서 해싱값을 생성합니다.
// 그리고 %064x에서 x는 16진수이고, 총 64자리의 16진수에서 값이 들어가지 못한 자리는 0으로 채워지게 됩니다.
// 최종적으로 SHA-256 해싱된 값이 16진수로 64바이트로 나오게됩니다.
// enPassword가 최종적으로 나온 해싱 결과값입니다.
String enPassword = String.format("%064x", new BigInteger(1, messageDigest.digest()));

SHA-512 도 방법은 마찬가지이다.


양방향 암호화 (Two-way Encryption)

  • AES-128, AES-256, DES…
  • “APPLE” 이라는 단어를 “1234”라는 키로
암호화 하면 “~”알 수 없는 단어들로 나옴.
  • 위에서 튀어나온 키를 “1234”로만 복호화
(Decrypt)해야 “APPLE”이라는 평문이 다시 튀어나온다.
  • 복호화가 되는 암호화라는 건 원문이 훼손되지 않는다라는 것. 암호화 하는 내용이 길어질수록 암호화된 내용도 길어진다.
  • CBC, ECB 등의 방식이 있음. (ECB 방식 폐기)

비대칭 암호화 (Asymmetric Encryption)

  • RSA 등
  • 암호화 할 때의 키와 복호화 할 때의 키가 따로 있다.
  • 공개 키(Public Key), 비밀 키(Private Key)로 나뉘어져 있으며 공개키는 암호화만, 비밀 키는 암/복호화를 할 수 있다.
  • 공인인증서, HTTPS SSL인증서, SSH 키
  • 가장 안전함.

단(일)방향 암호화 (One-way Encryption, Hash, Hashing)

  • CRC-16(8byte), CRC-32
  • MD5(32byte)
  • SHA1, SHA224, SHA256, SHA384, SHA512
  • 위 알고리즘은 모두 0~9, a~f 까지의 16진법을 구성하는 문자로 구성 되어있음.
  • 암호화시 키를 요구하지 않음. 복호화 불가능
비밀번호 저장이나 파일 무결성 검사시에 사용한다.
  • 서로 다른 두 값을 집어넣었을 때 같은 값이 나올 수 있는 가능성이 있기에 MD5는 사용하지 않게 됨. 알고리즘을 어겼다,
  • BFA(Brute Force Attack, 무작위대입공격)
profile
코드를 두드리면 문이 열린다

0개의 댓글