대칭키(키가 하나)
발행주체와 검증주체가 같아야 함
발행주체와 검증주체가 다르면 대칭키로는 힘듬
검증하는 키를 받아오거나 (단점: 키 가져올때 위험함)
토큰을 발행처에 줘서 검증을 대신 해주라고 하거나 (단점 : 비용이 많이 듬)
둘다 힘듬
RSA
(키가 2개 공개키와 개인키)
잠근 키로는 못열고 다른 키로만 열 수 있음
개인키로 잠궜으니까 공개키로 열리는거
RSA:발행주체와 검증주체가 달라도 돌아감
CIA
C=기밀성
I=위조X
A=사용가능성
홍군A
A개인키 A공개키 B공개키
청군
A공개키 B공개키
홍군B
B개인키 B공개키 A공개키
A가 B에게 보낼때 :
평문을 만든다
B의 공개키로 잠근다
다시 그걸 A의 개인키로 잠근다(전자서명, 이걸 안하면 다른사람이 A인척 보낼 수도 있으니까)
B가 받으면 :
A의 공개키로 연다 (만약 안열린다면 A가 보낸게 아님)
다시 그걸 B의 개인키로 연다 (B개인키는 B만 들고있으니까 B만 볼 수 있음)
단방향 (1234를 넣으면 BKD#ALI 이런식으로 난수화됨. 암호화만 되고 복호화 불가. 신뢰성만 검사할 때(해쉬함수, 비밀번호 등에 사용))
MD5 (크랙됨)
SHA512 (솔트 사용 안함 (레인보우테이블 비교하는 방식에 취약함))
BCrypt (솔트 사용(자동적용))
양방향(암호화,복호화 둘다 됨 / 암호화한 내용 해석이 필요할떄)
대칭키(발행주체와 검증주체가 같음) - DES(크랙됨), AES
공개키(발행주체와 검증주체가 다름) - RSA : HTTPS, 공인인증서, 블록체인 등이 씀
솔트 : 비밀번호를 그냥 암호화 안하고 비밀번호 뒤에 솔트를 넣어서
(비밀번호:123 솔트:asd면 123asd를 암호화)
bcrypt
build.gradle
dependencies {
// https://mvnrepository.com/artifact/org.mindrot/jbcrypt
implementation group: 'org.mindrot', name: 'jbcrypt', version: '0.4'
String encPassword = BCrypt.hashpw("1234", BCrypt.gensalt());
System.out.println("encPassword : " + encPassword);
// 암호화 하기
boolean isValid = BCrypt.checkpw("1234", encPassword);
System.out.println(isValid);
// 암호화된값과 패스워드 비교해서 boolean으로 결과
해싱
대문자소문자도 다르면 다름
복호화 불가능
해쉬결과를 여러번 봐서 경험적으로 뭔지 추측하거나 데이터가있으면 복호화 가능
서명의 역할