Node.js merupakan platform yang populer untuk pengembangan aplikasi berbasis JavaScript. Namun, karena kode sumbernya mudah dibaca dan dimo...
Node.js merupakan platform yang populer untuk pengembangan aplikasi berbasis JavaScript. Namun, karena kode sumbernya mudah dibaca dan dimodifikasi, ada tantangan dalam mengamankan kode agar tidak bisa diubah atau dibajak oleh pihak yang tidak berwenang. Salah satu solusi untuk masalah ini adalah dengan menggunakan teknik enkripsi dan obfuscation, serta mengonversi script menjadi binary executable.
Dalam artikel ini, kita akan membahas berbagai metode untuk mengamankan script Node.js agar tidak mudah dimodifikasi atau dibaca oleh orang lain.
1. Menggunakan Obfuscation Code
Obfuscation atau pengacakan kode adalah teknik untuk mengubah kode sumber menjadi bentuk yang sulit dibaca tanpa mengubah fungsionalitasnya. Teknik ini sering digunakan untuk menghambat upaya reverse engineering.
1.1. Menggunakan JavaScript Obfuscator
Salah satu tools yang bisa digunakan untuk melakukan obfuscation pada kode JavaScript adalah javascript-obfuscator.
Cara menggunakannya:
- Install package:
npm install -g javascript-obfuscator
- Jalankan perintah berikut untuk mengubah kode:
javascript-obfuscator input.js --output output.js
Contoh kode sebelum obfuscation:
function helloWorld() {
console.log("Hello, World!");
}
helloWorld();
Setelah obfuscation:
var _0x3e74=['log','Hello,\x20World!'];(function(_0x4c56a6,_0x3e7402){
var _0x586aa2=function(_0x5e2dcd){
while(--_0x5e2dcd){
_0x4c56a6['push'](_0x4c56a6['shift']());
}
};
_0x586aa2(++_0x3e7402);
}(_0x3e74,0x1aa));var _0x586a=function(_0x4c56a6,_0x3e7402){
_0x4c56a6=_0x4c56a6-0x0;
var _0x586aa2=_0x3e74[_0x4c56a6];
return _0x586aa2;
};
function helloWorld(){
console[_0x586a('0x0')](_0x586a('0x1'));
}
helloWorld();
Kode ini tetap berjalan normal tetapi sangat sulit dipahami oleh manusia.
2. Mengenkripsi Kode JavaScript
Selain obfuscation, kita juga bisa mengenkripsi kode sumber menggunakan teknik enkripsi. Salah satu metode yang bisa digunakan adalah dengan mengenkripsi file .js
dan mendekripsinya saat runtime.
2.1. Menggunakan AES untuk Enkripsi Kode
Gunakan library crypto
bawaan Node.js untuk mengenkripsi kode sumber.
Contoh enkripsi file menggunakan AES-256:
const crypto = require('crypto');
const fs = require('fs');
const algorithm = 'aes-256-cbc';
const key = crypto.scryptSync('password-kuat', 'salt', 32);
const iv = crypto.randomBytes(16);
function encryptFile(inputFile, outputFile) {
const cipher = crypto.createCipheriv(algorithm, key, iv);
const input = fs.createReadStream(inputFile);
const output = fs.createWriteStream(outputFile);
input.pipe(cipher).pipe(output);
output.on('finish', () => console.log('File berhasil dienkripsi'));
}
encryptFile('script.js', 'script.enc');
Lalu, untuk menjalankan kode yang sudah dienkripsi, kita bisa mendekripsinya saat runtime.
function decryptFile(inputFile) {
const decipher = crypto.createDecipheriv(algorithm, key, iv);
const input = fs.readFileSync(inputFile);
return Buffer.concat([decipher.update(input), decipher.final()]).toString();
}
const decryptedCode = decryptFile('script.enc');
eval(decryptedCode); // Menjalankan kode hasil dekripsi
Metode ini membuat kode sumber tidak bisa dibaca langsung tanpa kunci enkripsi.
3. Mengonversi Script Menjadi Binary Executable
Cara paling aman agar kode tidak bisa diubah atau di-decode adalah dengan mengonversi script Node.js menjadi binary executable.
3.1. Menggunakan pkg dari vercel
pkg
adalah alat yang memungkinkan kita mengonversi aplikasi Node.js menjadi binary executable.
Cara menggunakannya:
- Install
pkg
:npm install -g pkg
- Buat file
package.json
jika belum ada, lalu tambahkan konfigurasi berikut:{ "bin": "script.js" }
- Jalankan perintah berikut untuk membuat binary:
pkg script.js --targets node18-linux-x64,node18-win-x64,node18-macos-x64
Setelah proses selesai, kita akan mendapatkan file executable yang bisa dijalankan langsung tanpa perlu Node.js.
4. Menggunakan Native Addon C++ untuk Node.js
Jika Anda ingin keamanan yang lebih tinggi, Anda bisa menulis bagian dari kode dalam bahasa C++ sebagai Native Addon. Kode dalam C++ dikompilasi menjadi binary sehingga lebih sulit untuk dibalikkan ke bentuk kode asli.
Langkah-langkah:
- Install
node-gyp
:npm install -g node-gyp
Buat file
addon.cc
:#include <node.h> namespace demo { using v8::FunctionCallbackInfo; using v8::Isolate; using v8::Local; using v8::Object; using v8::String; using v8::Value; void Method(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = args.GetIsolate(); args.GetReturnValue().Set(String::NewFromUtf8(isolate, "Hello from C++").ToLocalChecked()); } void Initialize(Local<Object> exports) { NODE_SET_METHOD(exports, "hello", Method); } NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize) }
- Buat file
binding.gyp
:{ "targets": [ { "target_name": "addon", "sources": ["addon.cc"] } ] }
- Jalankan perintah berikut untuk membangun addon:
node-gyp configure build
- Gunakan addon di Node.js:
const addon = require('./build/Release/addon'); console.log(addon.hello());
Kode ini akan dieksekusi dari file .node
yang sudah dikompilasi sehingga lebih sulit untuk diubah.
Kesimpulan
Untuk mengamankan script Node.js agar tidak bisa dimodifikasi atau di-decode, ada beberapa metode yang bisa digunakan:
- Obfuscation Code menggunakan
javascript-obfuscator
untuk membuat kode sulit dibaca. - Enkripsi kode sumber menggunakan AES-256 dan hanya mendekripsi saat runtime.
- Mengubah script menjadi binary executable menggunakan
pkg
agar kode tidak bisa dilihat langsung. - Menggunakan Native Addon C++ untuk menjalankan bagian penting aplikasi dalam bentuk binary.
Dengan kombinasi metode ini, kita bisa membuat kode lebih aman dan sulit untuk di-reverse engineer.
COMMENTS