Mobile Gateway Service menyediakan verifikasi signature HTTP di sisi server untuk mengamankan lalu lintas antara gateway dan server backend Anda.
Saat Anda mengaktifkan verifikasi signature untuk kelompok API di Konsol gateway, Mobile Gateway Service menandatangani setiap permintaan API dalam kelompok tersebut. Anda dapat membuat kunci publik dan kunci privat yang digunakan untuk penandatanganan di Konsol gateway.
Server backend Anda membaca string signature dan menghitung signature secara lokal terhadap permintaan yang diterima. Selanjutnya, server membandingkan signature yang dihitung dengan signature yang diterima untuk menentukan validitas permintaan tersebut.
Membaca tanda tangan
Signature yang dihitung oleh Mobile Gateway Service disimpan dalam header permintaan. Kunci header tersebut adalah X-Mgs-Proxy-Signature.
Identifier kunci rahasia dikonfigurasi dalam kelompok API dan digunakan untuk menemukan nilai rahasia yang sesuai. Identifier ini dikirim dalam header permintaan dengan kunci X-Mgs-Proxy-Signature-Secret-Key.
Metode verifikasi signature
Data untuk menambahkan signature organisasi
String stringToSign =
HTTPMethod + "\n" +
Content-MD5 + "\n" +
UrlHTTPMethod: Metode HTTP dalam huruf kapital, sepertiPUTatauPOST.Content-MD5: Nilai MD5 dari badan permintaan, dihitung sebagai berikut:Jika
HTTPMethodbukan `PUT` atau `POST`, nilai MD5 adalah string kosong (`""`).Jika badan permintaan berupa form, MD5-nya adalah string kosong
"". Jika tidak, lanjutkan ke langkah ketiga.Hitung nilai MD5. Jika permintaan tidak memiliki badan,
bodyStreamadalah string"null".String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getBytes("UTF-8")));PentingMeskipun nilai
Content-MD5adalah string kosong (`""`), line feed (`\n`) berikutnya dalam string yang akan ditandatangani tetap harus disertakan. Hal ini menghasilkan dua karakter `\n` berturut-turut dalam string tersebut.
Url: `Url` dibentuk dari path, kueri, dan parameter form dalam badan permintaan. Sebagai contoh, asumsikan permintaan adalahhttp://ip:port/test/testSign?c=3&a=1dan parameter form-nya adalahb=2&d=4. `Url` dibentuk sebagai berikut:Ambil path-nya. Path adalah bagian URL setelah
ip:portdan sebelum?. Dalam contoh ini, path-nya adalah/test/testSign.Jika permintaan tidak memiliki parameter kueri atau form, `Url` sama dengan path tersebut.
Gabungkan parameter-parameter tersebut. Urutkan parameter kueri dan form berdasarkan kuncinya dalam urutan leksikografis. Lalu, gabungkan menjadi format
Key1=Value1&Key2=Value2&...&KeyN=ValueN. Dalam contoh ini, hasilnya adalaha=1&b=2&c=3&d=4.CatatanJika parameter kueri atau form memiliki multiple value, gunakan hanya
valuepertama.Bentuk `Url`. Formatnya adalah
Path?Key1=Value1&Key2=Value2&...&KeyN=ValueN. Dalam contoh ini, `Url`-nya adalah/test/testSign?a=1&b=2&c=3&d=4.
Verifikasi tanda tangan
Verifikasi signature menggunakan algoritma MD5
String sign = "xxxxxxx"; // Signature dari Mobile Gateway Service String salt ="xxx"; // Salt MD5 MessageDigest digest = MessageDigest.getInstance("MD5"); String toSignedContent = stringToSign + salt; byte[] content = digest.digest(toSignedContent.getBytes("UTF-8")); String computedSign = new String(Hex.encodeHexString(content)); boolean isSignLegal = sign.equals(computedSign) ? true : false;Verifikasi signature menggunakan algoritma RSA
String sign = "xxxxxxx"; // Signature dari Mobile Gateway Service String publicKey ="xxx"; // Kunci publik RSA dari Mobile Gateway Service PublicKey pubKey = KeyReader.getPublicKeyFromX509("RSA", new ByteArrayInputStream(publicKey.getBytes())); java.security.Signature signature = java.security.Signature.getInstance("SHA1WithRSA"); signature.initVerify(pubKey); signature.update(stringToSign.getBytes("UTF-8")); boolean isSignLegal = signature.verify(Base64.decodeBase64(sign.getBytes("UTF-8")));
Contoh kode
Untuk informasi lebih lanjut, lihat HttpSignUtil.java.