Skip to content

Instantly share code, notes, and snippets.

@nyancodeid
Created May 17, 2020 10:06
Show Gist options
  • Save nyancodeid/a1aa5f1cb073131911c8901c1bbc2d0b to your computer and use it in GitHub Desktop.
Save nyancodeid/a1aa5f1cb073131911c8901c1bbc2d0b to your computer and use it in GitHub Desktop.
Secure File Proposal

What the hell is going on with my Code

Proposal

Encrypt

Alur prosess enkripsi untuk Android dan Server

SecretKey = PIN -> MD5 -> SHA-256 (32 karakter awal)

Client Side (Android)

  1. User upload file raw nya dengan format nama file ${checksum}.raw di Firebase Storage dengan ref /storage/raws/${filename}.
  2. User juga akan menambahkan record di Firebase Realtime Database dengan ref /files/${uid}/${hash-key} dan record dengan format
{
  "checksum": "FILE_CHECKSUM_SHA256",
  "hashKey": "PIN_WITH_MD5_HASH",
  "file": {
    "extension": ".jpg",
    "name": "FILE_NAME",
    "size": 1024,
  }
}
  1. Dengan di tambahkannya kedua hal tersebut maka, secara bersamaan dan realtime server akan membuat listener ketika ada data baru dari Realtime Database maka server akan melakukkan enkripsi AES 256 pada file raw yang akan di download terlebih dahulu.

Server Side (Firebase & NodeJS)

Ketika server mendapatkan data baru atau mendeteksi ada perubahan data pada record Firebase Realtime Database maka server akan melakukkan beberapa langka berikut.

  1. Server akan mendownload file raw yang di simpan di Firebase Storage.
  2. Server akan melakukkan prosess enkripsi dengan parameter berikut:

SecretKey: HashKey akan di hash kembali dengan algoritma SHA-256 yang di ambil 32 karakter awalnya saja.

  1. Server akan mengupload file enkripsi yang sudah jadi ke Firebase Storage dengan ref /storage/files/${checksum}.crypt.
  2. Server juga akan menhapus file raw tepat setelah file yang sudah di enkripsi berhasil di upload.
  3. Server akan menandai bahwa file enkripsi sudah ada di Firebase Storage dengan menambahkan record di Firebase Realtime Database.
{
  "checksum": "FILE_CHECKSUM_SHA256",
  ...
  "encrypted": true,
}

Decrypt

Apa yang terjadi saat prosess decrypt di lakukkan dari Client.

Client Side (Android)

  1. Client memilih users pemilik file yang di maksud berdasarkan nama user pemilik file sesuai dengan Google Account yang dipakai saat login.
  2. Setelahnya user akan memasukkan PIN yang sesuai dengan file yang dimaksudkan. Setiap file memiliki kode unik PIN masing masing. PIN terdiri dari 6 angka.
  3. User akan mengirim HTTP Request ke server untuk meminta file yang di maksud.
{
  "uid": "UID_USER",
  "request": {
    "uid": "UID_FILE_OWNER",
    "hashKey": "PIN_WITH_MD5_HASH"
  }
}
  1. User mendapatkan link download file di Firebase Storage.
  2. User mendownload file yang sudah di decrypt.

Server Side (Firebase & NodeJS)

Tugas server dalam menangani permintaan decrypt dari user.

  1. Server menerima request dengan query yang format yang sudah dikirim oleh user.
  2. Server mencari file yang di maksud di record Firebase Realtime Database.
  3. Server mendownload file enkripsi di Firebase Storage.
  4. Server melakukkan proses decrypt terhadap file yang sudah di encrypt dengan algoritma AES-256 dengan SecretKey sesuai dengan format kunci sebelumnya.
  5. Server mencocokan keaslian file dengan mencocokan Checksum file yang sudah ada di record Firebase Realtime Database dengan checksum yang dibuat oleh Server dengan file yang sudah di decrypt.
  6. Jika cocok maka server akan mengupload file tsb ke Firebase Storage dengan ref /storage/files/temp/${checksum}.${fileExt}.
  7. Jika tidak cocok maka server akan mengirim response {"message":"Not Match"}
  8. Jika file cocok dan berhasil di upload maka server akan mengirimkan response {"message":"Successfuly","url":"URL_DOWNLOAD"}.

NB: Kendala dari sistem ini maka server tidak bisa terlalu lama dalam melakukkan prosess yang kadang akan berakibat timeout. Maka Android perlu memperpanjang batas timeout untuk request nya. Atau user yang melakukkan listen pada record yang dimaksud (Database Reference). Untuk cara lebih mudah dan dimengerti adalah langkah yang sudah dijelaskan di atas.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment