[python] Flask-RESTful에서 암호화된 데이터를 전송하는 방법

암호화된 데이터를 전송하는 것은 웹 애플리케이션에서 중요한 보안 문제입니다. Flask-RESTful을 사용하여 데이터를 암호화하여 전송하는 방법을 알아보겠습니다.

1. 암호화 모듈 설치

암호화를 위해 PyCryptodome 모듈을 사용하겠습니다. 아래 명령어를 사용하여 모듈을 설치하세요.

pip install pycryptodome

2. 데이터 암호화

먼저, 데이터를 암호화하는 함수를 만들어보겠습니다.

from Cryptodome.Cipher import AES
from Cryptodome.Random import get_random_bytes
from base64 import b64encode

def encrypt(data, key):
    cipher = AES.new(key, AES.MODE_EAX)
    nonce = cipher.nonce
    ciphertext, tag = cipher.encrypt_and_digest(data.encode('utf-8'))
    return b64encode(nonce + ciphertext + tag).decode('utf-8')

위의 코드는 AES 알고리즘을 사용하여 데이터를 암호화하는 함수입니다. data는 암호화할 데이터이고 key는 암호화에 사용될 키입니다. 함수는 암호문을 Base64로 인코딩하여 반환합니다.

3. Flask-RESTful API 구현

암호화된 데이터를 전송하기 위해 Flask-RESTful API를 구현해야 합니다. 아래는 간단한 예시입니다.

from flask import Flask
from flask_restful import Resource, Api
from flask_restful.reqparse import RequestParser

app = Flask(__name__)
api = Api(app)

class EncryptData(Resource):
    def post(self):
        parser = RequestParser()
        parser.add_argument('data', type=str, help='Data to encrypt', required=True)
        args = parser.parse_args()
        
        key = b'SuperSecretKey12345'  		# 암호화에 사용할 키
        encrypted_data = encrypt(args['data'], key)    # 데이터 암호화
        
        return {'encrypted_data': encrypted_data}, 200

api.add_resource(EncryptData, '/encrypt')

if __name__ == '__main__':
    app.run(debug=True)

위의 코드는 EncryptData라는 Flask-RESTful 리소스로 POST 요청을 처리합니다. 요청으로 전달된 data를 암호화한 후, 암호화된 데이터를 응답으로 반환합니다.

4. 암호화된 데이터 전송

Client 측에서는 암호화된 데이터를 복호화할 수 있는 키를 가지고 있어야 합니다. 이 키를 사용하여 암호화된 데이터를 복호화할 수 있습니다. 아래는 간단한 예시입니다.

from Cryptodome.Cipher import AES
from base64 import b64decode

def decrypt(encrypted_data, key):
    encrypted_data = b64decode(encrypted_data)
    nonce = encrypted_data[:16]
    ciphertext = encrypted_data[16:-16]
    tag = encrypted_data[-16:]

    cipher = AES.new(key, AES.MODE_EAX, nonce)
    plaintext = cipher.decrypt_and_verify(ciphertext, tag)
    return plaintext.decode('utf-8')

위의 코드는 encrypt 함수와 반대로 데이터를 복호화하는 함수입니다. encrypted_data는 암호화된 데이터이고 key는 복호화에 사용될 키입니다. 함수는 평문을 반환합니다.

위의 예시 코드를 참고하여 Flask-RESTful API에서 받은 암호화된 데이터를 복호화할 수 있습니다.

이렇게 Flask-RESTful에서 암호화된 데이터를 전송하는 방법을 알아보았습니다. 데이터의 보안을 위해 암호화를 사용하는 것은 매우 중요합니다. Flask-RESTful을 사용하여 암호화된 데이터를 전송하면 웹 애플리케이션의 보안을 강화할 수 있습니다.