Computer Science

단방향 암호화와 양방향 암호화 방식

emhaki 2024. 1. 20. 15:47
728x90
반응형
SMALL

IT 개발자로서 개발을 하다보면 이용자의 개인정보 보호를 위해 어떤 암호화 방식을 적용할 것인가를 마주하게 된다. 다양한 암호화 방식중에 단방향 암호화와 양방향 암호화에 차이를 알아보고 어떤 암호화 알고리즘이 있는지 살펴보자.

단방향 암호화

단방향 암호화는 원래대로 돌아갈 수 없는 암호화이다. 즉, 복호화가 불가능한 암호화를 말한다. 대표적으로 hash가 있으며 암호화된 값으로부터 다시 돌아갈 수 없기 때문에 단방향이라고 부른다. Hash 함수는 같은 입력 값에 대해 같은 출력값이 나오는게 보장이 되지만, 출력값으로 입력 값을 유추할 수 없다.

입력값 출력값
haki fa6f14f5791509d1d7b991788a1c88a9
haki fa6f14f5791509d1d7b991788a1c88a9

위와 같이 같은 입력값에 대해서는 같은 출력값을 가진다. 하지만 출력값을 DB에 저장하게 되면 저 값이 haki인지는 알 수 없으니 DB가 노출되어도 보안에 안전하다고 볼 수 있다. 

 

🔎 그렇다면 비밀번호가 일치하는지는 어떻게 알 수 있는가?

복호화가 안된다면 사용자가 입력한 haki와 DB에 저장된 fa6f14f5791509d1d7b991788a1c88a9 값이 일치하는지 어떻게 알 수 있을까? 프론트(로그인페이지)에서 입력한 값은 haki일텐데 말이다. Hash 함수는 같은 입력 값에 대해 같은 출력값이 나오기 때문에 사용자가 입력한 haki 값에 대해 동일 알고리즘 방식을 적용하면 DB에 저장된 값과 입력한 값이 일치하는지 여부만 확인하면 된다. 즉, 복호화 할 필요가 없다는 뜻이다. "동일한 출력값"과 복호화 불가능에 가깝기 때문에 대부분의 암호화에 단방향 암호화가 쓰인다.

 

🔎 Python에서의 단방향 암호화, key값 사용, base64 인코딩 예시

import hashlib
import os
import base64

def generate_salt():
    # 무작위 바이트로 구성된 솔트 생성
    return os.urandom(16)

def sha256_hash_with_salt(data, salt):
    # 데이터와 솔트를 합쳐서 바이트로 변환
    data_bytes = (data + salt).encode('utf-8')

    # SHA-256 해시 생성
    sha256_hash = hashlib.sha256(data_bytes).digest()

    return sha256_hash

def hash_password(password):
    # 솔트 생성
    salt = generate_salt()

    # 해시 생성
    hashed_value = sha256_hash_with_salt(password, salt)

    # Base64로 인코딩
    encoded_hash = base64.b64encode(hashed_value).decode('utf-8')

    return encoded_hash, salt

# 예시로 "MyPassword123"를 해싱
hashed_password, salt = hash_password("MyPassword123")
print("Hashed Password (Base64):", hashed_password)
print("Salt (Base64):", base64.b64encode(salt).decode('utf-8'))

hsahlib이라는 라이브러리를 통해 암호화를 간편하게 할 수 있다. 보안을 더 높이기 위해 Salt를 통해서 해커가 복호화 하는 것을 방해할 수 있다. 입력으로 들어가는 비밀번호에 추가 문자열을 덧붙이는 방식이다. 이렇게 하게되면 A 유저와 B 유저의 암호화전 비밀번호가 동일하다고 해도 출력 값이 다르기 때문에 보안성이 더 올라간다.

 

양방향 암호화

양방향 암호화는 이름에서부터 알 수 있듯, 원래대로 돌아갈 수 있는 암호화 방식이다. 즉, 복호화가 가능하다. 복호화 방식으로 대칭키 암호화 방식과 비대칭 키 암호화 방식이 있다. 대칭키 방식의 경우 암/복호화 시 사용되는 키가 동일한 방식이다. 비대칭 키 방식은 개인키를 각 사용자가 가지고 공개키는 모든 사람이 접근하게끔 한 방식이다. 예를 들면 A의 공개키를 사용해 암호화한 문서는 A의 개인키로만 복호화 할 수 있다.

 

🔎 대칭 키 암호화

출처: https://upload.wikimedia.org/wikipedia/commons/6/61/Simple_symmetric_encryption.png

대칭 키 암호화 방식은 암/복호화 시 동일한 키를 이용하여 암호화하는 방식이다. 대칭키 암호화 방식의 장점은 비대칭 키 암호화 방식에 비해 암복호화 속도가 매우 빠르다는 장점이 있다. 이를 통해 대용량 파일을 빠르게 암호화가 가능하다. 하지만 보안적으로는 키가 탈취될 경우 복호화가 쉽다는 단점이 있다. python의 대칭키 암호화 방식 예제는 아래와 같다.

from cryptography.fernet import Fernet

def generate_key():
    # 대칭키 생성
    key = Fernet.generate_key()
    return key

def encrypt_data(data, key):
    # Fernet 객체 생성
    cipher = Fernet(key)

    # 데이터 암호화
    encrypted_data = cipher.encrypt(data.encode('utf-8'))
    return encrypted_data

def decrypt_data(encrypted_data, key):
    # Fernet 객체 생성
    cipher = Fernet(key)

    # 데이터 복호화
    decrypted_data = cipher.decrypt(encrypted_data).decode('utf-8')
    return decrypted_data

# 대칭키 생성
key = generate_key()

# 원본 데이터
original_data = "Hello, symmetric encryption!"

# 데이터 암호화
encrypted_data = encrypt_data(original_data, key)
print("Encrypted Data:", encrypted_data)

# 데이터 복호화
decrypted_data = decrypt_data(encrypted_data, key)
print("Decrypted Data:", decrypted_data)

 

🔎 비대칭 키 암호화

출처: https://raonctf.com/essential/study/web/asymmetric_key

비대칭 키 암호화는 서로 다른 키 쌍을 이용해 암복호화 하는 암호화 방식이다. 공개 키는 서버 상에 공개되어 누구나 해당 키를 이용하여 암호화 할 수 있다. 이렇게 암호화 된 데이터는 개인 키를 통해서만 복호화가 가능하기 때문에 데이터를 수신한 수신자만 확인이 가능하다. 비대칭키 암호화의 장점은 처음 생성한 키 쌍에서 개인 키만 한 번 전달하고나면 키를 교환할 필요가 없기 때문에 키가 탈취되는 공격에 대해 비교적 자유로운 편이다. 반면 단점으로는 암복호화 시 속도가 매우 느리다. 

 

📚 Reference

 

[보안] 단방향 암호화 / 양방향 암호화란?

소프트웨어를 개발할 때, 외부 유출에 민감한 데이터를 다룬다면 좋든 싫든 데이터 암호화를 고려할 수 밖에 없다. 이 때 일반적으로 패스워드는 단방향 암호화 알고리즘을, 그 외의 개인을 식

blog.retrotv.dev

 

[NODE] 📚 crypto 모듈 (단방향 / 양방향) 암호화 원리 & 사용법

암호화 종류 암호화를 하는 이유는 해당 정보가 중요하기 때문이다. 암호화에는 여러가지 방법이 있을 수 있다. 대표적으로 단반향과 양방향 암호 방식이 있는데, 단방향은 암호화할 수는 있어

inpa.tistory.com

 

728x90
반응형

'Computer Science' 카테고리의 다른 글

인증과 인가  (0) 2023.04.02
쿠키(Cookie)와 세션(Session)  (0) 2023.02.08
함수형 프로그래밍의 특징과 장단점  (0) 2023.02.08
IPC(Inter-Process Communication)란?  (2) 2023.02.06
[DB] 데이터베이스 정규화란?  (0) 2023.02.02