Proposal
Alur prosess enkripsi untuk Android dan Server
SecretKey
= PIN -> MD5 -> SHA-256 (32 karakter awal)
- User upload file raw nya dengan format nama file
${checksum}.raw
di Firebase Storage dengan ref/storage/raws/${filename}
. - 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,
}
}
- 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.
Ketika server mendapatkan data baru atau mendeteksi ada perubahan data pada record Firebase Realtime Database maka server akan melakukkan beberapa langka berikut.
- Server akan mendownload file raw yang di simpan di Firebase Storage.
- 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.
- Server akan mengupload file enkripsi yang sudah jadi ke Firebase Storage dengan ref
/storage/files/${checksum}.crypt
. - Server juga akan menhapus file raw tepat setelah file yang sudah di enkripsi berhasil di upload.
- Server akan menandai bahwa file enkripsi sudah ada di Firebase Storage dengan menambahkan record di Firebase Realtime Database.
{
"checksum": "FILE_CHECKSUM_SHA256",
...
"encrypted": true,
}
Apa yang terjadi saat prosess decrypt di lakukkan dari Client.
- Client memilih users pemilik file yang di maksud berdasarkan nama user pemilik file sesuai dengan Google Account yang dipakai saat login.
- Setelahnya user akan memasukkan PIN yang sesuai dengan file yang dimaksudkan. Setiap file memiliki kode unik PIN masing masing. PIN terdiri dari 6 angka.
- 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"
}
}
- User mendapatkan link download file di Firebase Storage.
- User mendownload file yang sudah di decrypt.
Tugas server dalam menangani permintaan decrypt dari user.
- Server menerima request dengan query yang format yang sudah dikirim oleh user.
- Server mencari file yang di maksud di record Firebase Realtime Database.
- Server mendownload file enkripsi di Firebase Storage.
- Server melakukkan proses decrypt terhadap file yang sudah di encrypt dengan algoritma AES-256 dengan SecretKey sesuai dengan format kunci sebelumnya.
- 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.
- Jika cocok maka server akan mengupload file tsb ke Firebase Storage dengan ref
/storage/files/temp/${checksum}.${fileExt}
. - Jika tidak cocok maka server akan mengirim response
{"message":"Not Match"}
- 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.