본문 바로가기
IT/이것저것

[파이썬] 단방향 암호화 - Hash SHA256 예제

by 코드퀸 2023. 1. 3.
728x90
반응형

목차

1. 암호화 용어 정리
2. SHA 256 이란
3. 단방향 해시 함수 한계
4. 단방향 해시 함수 보완 
    - Key Stretching (키 스트레칭)
    - Salt (솔트)
5. 파이썬 예제 
    -  기본
    -  Key Stretching
    -  Key Stetching + Salt 

 

 

1. 암호화 용어 정리

  • 평문 : 암호화 전 메시지로, 해독 가능한 형태의 메시지(일반 문자 등)
  • 암호문 : 암호화 후 메세지로, 해독 불가능한 형태의 메시지(암호화 문자)
  • 암호화 : 평문을 암호화문으로 변환하는 과정
  • 복호화 : 암호화문을 평문으로 변환하는 과정
  • 단방향 암호화 : 평문을 암호화 가능, 복호화 불가능. 진위여부는 확인하고 싶으나, privacy를 지키고 싶은 경우 사용
  • 해시 함수 : 해시는 임의의 크기를 가진 데이터를 고정된 데이터의 크기로 변환시키는 함수 
  • 해시 : 다양한 길이를 가진 데이터를 고정된 길이 데이터로 매핑(mapping)한 값, Key-value 로 이루어진 자료 구조 

2. SHA256 이란?

  • SHA256은 SHA-2가 생성하는 암호화 문장을 256bit로 표현하는 것을 의미 (224,256,384,512도 있음)
  • 현재 가장 많은 분야에서 채택하여 사용되고 있는 암호 방식
  • 출력 속도가 빠르다는 장점을 갖고 있으며, 단방향성 성질을 띄고 있는 암호화 방법
  • 인증서, 블록체인 등 많이 사용되고 있음.  

3. 단방향 해시 함수 한계 

  • 동일한 메세지는 동일한 암호문장을 갖는다. 즉, 반복 시도하면 해킹 가능 

4. 단방향 해시 함수 보완

Key Stretching (키 스트레칭)
- 암호화를 N번 반복 수행하는 것이다.
- 반복 횟수는 개발자 본인만 알고 있으며, 해킹하려면 여러 번의 시도가 필요함. 즉, 시간 지연이 가능함

예)
1번 수행
- 입력 : 123456
- 암호화 결과 : 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
2번 수행
- 입력 : 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
- 암호화 결과 : 49dc52e6bf2abe5ef6e2bb5b0f1ee2d765b922ae6cc8b95d39dc06c21c848f8c

 

Key Stretching 설명

Salt (솔트)
- 그럼에도 불구하고, 몇 번 돌리면 비밀번호를 들킬 것 같다.
- 문자 그대로, 약간의 소금을 치듯이 사용자에게 개별 임의의 문자를 덧붙여 암호화 수행

예)
- 입력 : 123456 + abcd (salt)
- 암호화 결과 : 7eb6640227367c8ff142d877496ca3ec5e1c2fc218198fa937054dd69dc6046b

 

Salt 설명

5. 파이썬 예제

 

  • 기본 
import hashlib
print("====================================================================")
put = input("패스워드 입력 : ")
passwd = ''
result = hashlib.sha256(put.encode())
passwd += result.hexdigest()
result = hashlib.sha256(passwd.encode())

print("Start Passwd : ", put)

print("==================================================================")
result = hashlib.sha256(passwd.encode())
print("SHA256 : ",result.hexdigest())

passwd=''
passwd += result.hexdigest()

  • Key Stretching (키 스트레칭)
import hashlib
print("====================================================================")
put = input("패스워드 입력 : ")
passwd = ''
result = hashlib.sha256(put.encode())
passwd += result.hexdigest()
result = hashlib.sha256(passwd.encode())

print("Start Passwd : ", put)

print("==================================================================")

num = int(input("반복 횟수 : "))
for i in range(1,num+1):
    result = hashlib.sha256(passwd.encode())
    print("\npasswd(%d) : " %i, passwd)
    print("SHA256 : ",result.hexdigest())

    passwd=''
    passwd += result.hexdigest()

  • Key Strectching + Salt (솔트) 
import hashlib
print("====================================================================")
put = input("패스워드 입력 : ")
salt = input("솔트 문자 입력 : ")
put+= salt
passwd = ''
result = hashlib.sha256(put.encode())
passwd += result.hexdigest()
result = hashlib.sha256(passwd.encode())

print("Start Passwd : ", put)

print("==================================================================")

num = int(input("반복 횟수 : "))
for i in range(1,num+1):
    result = hashlib.sha256(passwd.encode())
    print("\npasswd(%d) : " %i, passwd)
    print("SHA256 : ",result.hexdigest())

    passwd=''
    passwd += result.hexdigest()

728x90
반응형

댓글