Adaptasi Vault Dokumen ke Backend FastAPI v7 ???

Catatan Adaptasi Vault JS ke FastAPI AES-256

๐Ÿ“˜ 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 JSAkan Digantikan OlehKeterangan
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

Popular posts from this blog

Token dan ID Bot Telegram serta ID Grup

Magot sebagai Pakan Ikan dan Ternak

Kebakaran & Kerusuhan Akhir Agustus 2025