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

1 Seo Postingan Tabel

Terkunci Login, Batas Salah Password, & Reset Manual