Adaptasi Vault Dokumen ke Backend FastAPI v7 ???
๐ Catatan Adaptasi Vault Dokumen JS ke Backend FastAPI (AES-256)
๐ฏ Tujuan
Mengubah logika JavaScript di Vault Dokumen TXT menjadi:
- ๐ค Backend Python (FastAPI) untuk enkripsi dan dekripsi AES-256
- ๐ Menggunakan IV acak, padding PKCS7, dan Base64 encoding.
- ๐ก Terhubung ke frontend HTML melalui
fetch
API
๐งฉ Bagian-Bagian Yang Diadaptasi
Bagian Asli di JS | Akan Digantikan Oleh | Keterangan |
---|---|---|
CryptoJS.AES.encrypt() |
pycryptodome |
Enkripsi & dekripsi dipindah ke server |
localStorage / <textarea> |
Tetap di frontend | Untuk input/output tetap di browser |
Password dari input | JSON body ke backend |
Dikirim ke server, diolah (salt/hash) |
Base64, IV, salt | Tetap dipakai | Untuk menjaga kompatibilitas standar |
✅ Langkah-Langkah Detil
๐น Langkah 1: Siapkan Project Python
mkdir vault_project && cd vault_project
๐น (Opsional) Buat Virtual Environment
# Linux/Mac
python -m venv env
source env/bin/activate
# Windows
python -m venv env
env\Scripts\activate
๐น Install FastAPI dan pycryptodome
pip install fastapi[all] pycryptodome
๐น Struktur Folder
vault_project/
├── main.py # Server FastAPI
└── static/
└── index.html # Frontend (HTML/JS)
๐ฆ File: main.py (FastAPI + AES-256)
from fastapi import FastAPI, Request
from pydantic import BaseModel
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Protocol.KDF import PBKDF2
import base64
import json
app = FastAPI()
class VaultData(BaseModel):
password: str
message: str = None
encrypted: str = None
def pad(data):
pad_len = 16 - len(data) % 16
return data + chr(pad_len) * pad_len
def unpad(data):
pad_len = ord(data[-1])
return data[:-pad_len]
@app.post("/encrypt")
def encrypt(data: VaultData):
salt = get_random_bytes(16)
key = PBKDF2(data.password, salt, dkLen=32, count=100000)
iv = get_random_bytes(16)
cipher = AES.new(key, AES.MODE_CBC, iv)
ct_bytes = cipher.encrypt(pad(data.message).encode())
result = {
"salt": base64.b64encode(salt).decode(),
"iv": base64.b64encode(iv).decode(),
"ciphertext": base64.b64encode(ct_bytes).decode()
}
return result
@app.post("/decrypt")
def decrypt(data: VaultData):
b = json.loads(data.encrypted)
salt = base64.b64decode(b["salt"])
iv = base64.b64decode(b["iv"])
ciphertext = base64.b64decode(b["ciphertext"])
key = PBKDF2(data.password, salt, dkLen=32, count=100000)
cipher = AES.new(key, AES.MODE_CBC, iv)
pt = cipher.decrypt(ciphertext).decode()
return {"message": unpad(pt)}
๐ File: static/index.html (Contoh Fetch API)
<script>
// Kirim ke backend
async function encrypt() {
const res = await fetch('/encrypt', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
password: document.getElementById('pass').value,
message: document.getElementById('msg').value
})
});
const data = await res.json();
document.getElementById('result').value = JSON.stringify(data);
}
async function decrypt() {
const res = await fetch('/decrypt', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
password: document.getElementById('pass').value,
encrypted: document.getElementById('result').value
})
});
const data = await res.json();
document.getElementById('msg').value = data.message;
}
</script>
๐งช Jalankan Server
uvicorn main:app --reload
๐ Catatan Tambahan
- Jangan lupa konfigurasi CORS jika frontend dan backend beda domain
- Gunakan HTTPS untuk keamanan
- Hash password atau lakukan validasi tambahan jika digunakan untuk login nyata
Comments
Post a Comment