코딩마을방범대
SHA-256 해싱 알고리즘 본문
728x90
해싱(hashing) 이란
- 해시 함수에 문자열 입력값을 넣어서 특정한 값으로 추출하는 것
해시 함수란?
- 임의의 데이터를 고정된 길이의 데이터로 매핑하는 단방향 함수
- 입력값을 해싱했을 때 출력값은 일정하다는 것을 근거로, 사용자의 비밀번호나 중요 정보의 내용을 해싱하여 복호화 할 수 없음
특징
- 어떤 입력 값에도 항상 고정된 길이의 해시값을 출력한다.
- 눈사태 효과 : 입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값을 출력한다.
- 출력된 결과 값을 토대로 입력값을 유추할 수 없다.
해시 테이블 (Hash Table)
- 해시 함수로 매핑한 키 값을 인덱스로 한 배열 혹은 객체
Java : Hash Map
Javascript : 객체 or Map
Python : 사전(dictionary)
충돌 (Collision)
- 해시 함수에 따라 여러 키 값이 하나의 값으로 매핑되는 경우
솔트(Salt)
- 해시함수를 돌리기 전 임의의 문자열을 붙이는 것
SHA(Secure Hash Algorithm)
- 미국 국가안보국(NSA)가 1993년에 처음 설계
- 미국 국가 표준
최초의 함수는 SHA-0
▼
2년 후 SHA-1 발표
▼
SHA-224, SHA-256, SHA-384, SHA-512 발표 [통칭해 SHA-2라고 함]
SHA-256 (단방향 암호화)
- 메시지, 파일 혹은 데이터 무결성 검증에 널리 사용되는 암호화 해싱 알고리즘(함수)
- 문자들을 256 bit 길이의 key로 변환 (64자리)
- 블록체인에서 가장 많이 사용되는 방식
🎃 SQL문으로 sha 인코딩 확인법
select sha2('1234!',256);
사용법
1. MessageDigest 인스턴스 생성
- 파라미터로 받는 알고리즘은 NoSuchAlgorithmException 를 발생시키므로 예외처리 필요
public String encrypt(String text) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-256");
2. 해시값 갱신
- 바이트코드로 변경 후 인스턴스의 해시값(digest)에 갱신
md.update(text.getBytes());
byte: 8bit 2진법(0 or 1)
Hex digits: 16bit
base64: 64bit
3. Byte -> Hex 변환
- 인스턴스의 해시값(digest)을 Hex로 변환
byte[] bytes = md.digest();
StringBuilder builder = new StringBuilder();
for (byte b : bytes) {
// %02x : b를 2자리 Hex String으로 출력
builder.append(String.format("%02x", b));
}
return builder.toString();
& 0xff
byte 로 표현 가능한 숫자는 -128~127 (1byte, 즉 8bit)
8bit로 0~255 까지의 값을 나타내고 싶다면 1byte가 아닌 4byte의 공간을 갖는 integer 로 형변환이 필요함
이를 위해서 0xff(integer 형)에 & 연산을 통하여 암묵적 형변환이 일어나게 함
4. 사용
// SHA256는 클래스 이름
SHA256 sha256 = new SHA256();
sha256.encrypt(인코딩할 텍스트);
💡 TIPS!
1. HTML 에러 코드
ERROR CODE | |
200 | 에러없이 성공적으로 페이지를 불러오거나 데이터를 전송 |
400 | Bad Request로써, 요청 실패-문법상 오류가 있어서 서버가 요청 사항을 이해하지 못함 |
404 | Not Found, 문서를 찾을 수 없음->클라이언트가 요청한 문서를 찾지 못한 경우에 발생함 (URL을 잘 살펴보기) |
405 | Method not allowed, 메소드 허용 안됨-> Request 라인에 명시된 메소드를 수행하기 위한 해당 자원의 이용이 허용되지 않았을 경우 발생함 (페이지는 존재하나, 그걸 못보게 막거나 리소스를 허용안함) |
415 | 지원되지 않는 형식으로 클라이언트가 요청을 해서 서버가 요청에 대한 승인을 거부한 오류를 의미 (ContentType,Content Encoding 데이터를 확인할 필요가 있다.) |
500 | 서버 내부 오류는 웹 서버가 요청사항을 수행할 수 없을 경우에 발생함 |
505 | HTTP Version Not Supported |
728x90
'💡 백엔드 > Java' 카테고리의 다른 글
Java로 메일 발송하기 (0) | 2023.05.26 |
---|---|
yml 정보 클래스로 가져오기 (0) | 2023.05.26 |
JAVA에서의 암호화 방법 (AES) (0) | 2023.05.26 |
ModelMapper란 (0) | 2023.05.25 |
Autowired를 지양하는 이유 & 정규표현식 (0) | 2023.05.25 |