Rabu, 30 Desember 2009

SQL SERVER

Daftar Isi





Kata Pengantar ............................................................................. v
Daftar Isi ..................................................................................... vii
BAB 1 CLR Integration........................................................ 1
1.1 .NET Framework dan SQL Server 2005 .......................1
1.1.1 Mengenal .NET Framework .............................1
1.1.2 Managed Code di dalam SQL Server ...............6
1.2 Transact-SQL, Extended Stored Procedure,
dan Managed Code.......................................................8
1.2.1 Transact-SQL dan Managed Code ...................9
1.2.2 Extended Stored Procedure
dan Managed Code........................................10
1.3 Penerapan Managed Code ..........................................11
1.3.1 Membuat CLR Stored Procedure ....................11
1.3.2 CLR Stored Procedure dengan Parameter ......19
1.3.3 Membuat CLR User-Defined Function ............26
1.3.4 Menginstal Unsafe Assembly .........................38
1.3.5 Managed Code yang Mengakses Database ....50
1.3.6 Membuat CLR Trigger....................................67
BAB 2 Enkripsi dan Dekripsi.............................................. 77
2.1 Dasar-Dasar Enkripsi .................................................77
2.2 Metode-Metode Enkripsi .............................................80
2.3 Hierarki Enkripsi pada SQL Server 2005 ....................89
2.3.1 Data Protection API........................................91 viii
2.3.2 Service Master Key ........................................96
2.3.3 Database Master Key...................................100
2.3.4 Symmetric Key............................................101
2.3.5 Asymmetric Key..........................................106
2.3.6 Certificate ....................................................111
BAB 3 Blok TRY/CATCH ................................................ 115
3.1 Blok TRY/CATCH untuk Penanganan Kesalahan......115
3.2 Blok TRY/CATCH yang Berlapis...............................119
3.3 Blok TRY/CATCH dengan Transaction .....................122
BAB 4 Definisi Common Table Expression ....................... 129
BAB 5 Operator PIVOT dan UNPIVOT ............................. 135
BAB 6 Operator EXCEPT dan INTERSECT....................... 141
BAB 7 Operator APPLY................................................... 147
BAB 8 Tipe Data XML ..................................................... 153
8.1 XML dan SQL Server ................................................153
8.2 Typed dan Untyped XML ..........................................159
8.3 Tips Membuat Skema XML.......................................169
8.3.1 Deklarasi Skema XML .................................169
8.3.2 Elemen Sederhana.......................................172
8.3.3 Elemen Kompleks .......................................179
BAB 9 XML Query dan XML DML .................................... 183
9.1 Mengenal Xpath........................................................183
9.2 Sumbu-Sumbu Xpath ...............................................189
9.3 Operator Xpath.........................................................191
9.4 Mengenal XQuery.....................................................200
9.4.1 Method query()............................................203
9.4.2 Method value() ............................................207
9.4.3 Method exist()..............................................208
9.4.4 Method modify() ..........................................209
9.4.5 Method nodes() ...........................................218
BAB 10 Penutup ............................................................... 221 77
BAB 2
ENKRIPSI DAN DEKRIPSI




2.1 Dasar-Dasar Enkripsi
Pada masa-masa lampau, para administrator database tidak me-
naruh perhatian terlalu besar mempelajari konsep enkripsi data,
karena umumnya mereka memandang mekanisme tersebut meru-
pakan sesuatu yang seharusnya dipikirkan oleh orang lain. Namun
pada perkembangan masa kini, hal-hal yang berkaitan dengan ke-
amanan data menjadi hal yang sangat krusial.
Pada topik ini, istilah “keamanan data” tidak berkaitan dengan
pencegahan kerusakan data, penanggulangan bencana, pemulih-
an data dan sejenisnya, melainkan lebih pada sistem proteksi un-
tuk mencegah bocornya data kepada pihak-pihak yang tidak ber-
kepentingan.
Masalah keamanan data menjadi isu yang sangat penting, terlebih
lagi menyangkut data-data sensitif di mana mekanisme penyim-
panan dan pengiriman atau pertukarannya, menuntut sistem per-
lindungan yang sangat terpercaya keandalannya sehingga tidak
mudah ditembus.
Sekali lagi, kita tidak berbicara mengenai hal-hal yang sifatnya
fisik seperti penempatan server di dalam sebuah ruangan baja
yang kokoh dengan kunci yang berlapis-lapis untuk mencegah
pencurian. 78
Saat ini kita akan belajar mengenai enkripsi data, yaitu sebuah
teknik pengamanan data, dimana sekalipun sebuah data berhasil
dicuri oleh pihak tertentu, bahkan dengan cara kekerasan sekali-
pun, ia belum tentu bisa membaca data tersebut karena ia berada
dalam keadaan acak. Diperlukan pengetahuan yang sangat khu-
sus untuk dapat menyusun kembali data acak tersebut menjadi
bentuk yang informatif.
Sejak SQL Server pertama kali dirilis hingga versi 2000, database
ini tidak memiliki fasilitas untuk mengamankan data. Seandainya
pun hal itu bisa dilakukan, mekanisme enkripsi dilakukan melalui
sistem yang dikembangkan oleh pihak ketiga. Anda benar jika
mengatakan SQL Server sudah lama mengenal enkipsi untuk pro-
teksi password dan skrip stored procedure, view, atau trigger, tapi
tidak untuk baris-baris data yang ada di dalam table atau proses-
proses lainnya. Enkripsi di dalam database SQL Server 2005
mempunyai cakupan dan penerapan yang jauh lebih luas.
Enkripsi data adalah sebuah proses mengacak data dengan meng-
gunakan sebuah atau beberapa fungsi matematika, sedemikian
kompleksnya sehingga amat sangat sulit bagi orang-orang untuk
memahami informasi aslinya, kecuali bagi orang yang memang
ditujukan menerima informasi tersebut.
Saya percaya kebanyakan dari kita pada masa kanak-kanak pasti
pernah menggunakan enkripsi sebagai sebuah permainan. Misal-
nya mengganti huruf-huruf menjadi huruf-huruf lain, atau meng-
ganti huruf-huruf menjadi bentuk atau gambar tertentu. Pesan
yang kita buat itu dijamin akan membingungkan teman-teman kita
yang tidak memahami algoritma enkripsinya, namun tidak bagi
sahabat kita yang telah memiliki cara membukanya. Sangat me-
nyenangkan.
Tapi tahukah Anda bahwa algoritma enkripsi yang sangat kita
banggakan pada waktu kecil itu adalah sebuah teknik yang paling
sederhana? Seseorang yang terlatih untuk memecahkan kode san-
di, tidak akan memerlukan waktu lama untuk mengetahui polanya
dan membaca pesan-pesan rahasia itu.
Sejarah enkripsi dimulai sejak ribuan tahun lalu dengan meng-
gunakan pena dan kertas atau alat-alat mekanis sederhana yang
dikenal sebagai “kriptografi klasik”. 79
Salah satu kisah inspirasional dalam sejarah kriptografi mungkin
adalah mesin Enigma. Enigma adalah sebuah alat elektromekanik
yang menyerupai mesin tik. Ia digunakan untuk meng-enkrip dan
men-dekrip pesan-pesan rahasia. Mesin itu pertama kali diguna-
kan untuk kepentingan komersial sekitar tahun 1920-an, setelah
itu diadopsi oleh pemerintah dan militer beberapa negara, ter-
utama Nazi Jerman, sebelum dan selama perang dunia kedua pa-
da tahun 1940-an.
Semasa perang, pihak-pihak yang bertikai sangat bergantung
pada mesin-mesin ini untuk mengirim pesan-pesan rahasia tanpa
diketahui musuh. Saat itu Enigma dibuat dalam beberapa model
dan variasi, dengan modifikasi pada bagian-bagian tertentu untuk
meningkatkan keampuhan enkripsinya.
Dengan berlatar belakang mesin Enigma, kemudian banyak dibuat
cerita-cerita dan film fiksi seputar perang dan penyusupan agen-
agen rahasia untuk mencuri informasi atau mesin itu. Sekali pun
dibumbui dengan karangan imajinatif, namun tampak jelas fakta
yang sesungguhnya, bahwa keamanan data adalah suatu hal yang
serius. Dari waktu ke waktu, algoritma enkripsi terus dikembang-
kan hingga hari ini, dan akan terus disempurnakan pada masa-
masa mendatang.
Beberapa teknik enkripsi modern yang populer dewasa ini adalah
DES, RC4, AES, RSA, dan SHA. Algoritma-algoritma yang kemu-
dian menjadi standar tersebut telah dikenal secara luas, diaplikasi-
kan pada banyak bidang, dan teruji kehandalannya. Adalah suatu
hal yang ironis, pada saat semakin tinggi kemampuan sebuah al-
goritma untuk meng-enkrip data rahasia, justru algoritma tersebut
semakin dikenal luas di dunia, dan rangkaian prosesnya terbuka
hingga sedetail-detailnya.
Hal ini mengajarkan kita, bahwa kerahasiaan data bukan terletak
pada algoritma enkipsinya. Justru dengan semakin transparannya
algoritma tersebut, para praktisi bisa saling berdiskusi, berbagi in-
formasi dan pengalaman, dan saling mengoreksi, yang tujuannya
untuk membuat algoritma itu semakin baik.
80
Selain melibatkan fungsi-fungsi matematis, teknik enkripsi modern
juga menggunakan input yang disebut dengan kunci atau key,
yang mencegah data di-dekrip seandainya algoritma enkipsinya
diketahui. Tanpa sebuah key yang dijaga kerahasiaannya, hampir
tidak mungkin bagi seseorang untuk membalik proses enkripsi
untuk membaca informasi asli dari data yang di-enkrip. Hampir
semua algoritma-algoritma enkripsi dewasa ini mempunyai opera-
si yang sama: mereka membaca sebuah informasi, kemudian
menggunakan sebuah key untuk mentransformasikannya menjadi
sebuah output.
Enkripsi adalah fungsi untuk mentransformasikan informasi asli,
atau disebut juga plaintext atau cleartext, menjadi output yang ti-
dak bisa dibaca dan acak, yang disebut dengan ciphertext. Se-
mentara itu, dekripsi adalah fungsi untuk mentransformasikan
ciphertext kembali menjadi plaintext.

Gambar 2.1. Hubungan plaintext, key, dan ciphertext.
2.2 Metode-Metode Enkripsi
Secara umum dikenal dua macam metode enkripsi, yaitu simetris
atau private key/secret key dan asimetris atau public key. Pada
enkripsi simetris, sebuah key yang sama, digunakan baik untuk
meng-enkrip maupun men-dekrip data. 81
Jika seseorang ingin mengirim pesan rahasia kepada temannya, ia
akan meng-enkrip plaintext tersebut menjadi sebuah ciphertext
dan mengirimkannya. Kemudian ia juga mengirimkan key-nya.
Setelah itu, temannya akan men-dekrip ciphertext yang diterima-
nya dengan key yang bersangkutan untuk memperoleh kembali
plaintext-nya.
Masalah utama dari metode ini adalah pada cara pengiriman key-
nya. Jika ciphertext dan key dikirim bersamaan dalam sebuah pa-
ket, kemudian paket tersebut jatuh ke tangan yang salah, maka
bukanlah hal yang sulit bagi orang itu melakukan dekripsi dan
membaca pesan rahasia tersebut sehingga proses enkripsi itu
hampir tidak berguna. Dengan demikian, pada enkripsi simetris,
ciphertext dan key harus dikirim secara terpisah, misalnya si pe-
ngirim dapat menggunakan e-mail untuk mengirim ciphertext ke-
pada si penerima dan memberitahukan key-nya menggunakan
telepon.
Ciphertext:

Key:

Gambar 2.2. Pengiriman ciphertext dan key pada enkripsi simetris.
Pada enkripsi asimetris, proses enkripsi dan dekripsi masing-ma-
sing menggunakan key yang berbeda, namun kedua key tersebut
saling berhubungan secara matematis. 82
Key yang pertama disebut private key dan dijaga kerahasiaannya
oleh satu orang. Key yang ke-2 disebut public key dan bebas
didistribusikan. Private key dibuat oleh seseorang dan hanya ia
yang mengetahui isinya.
Berdasarkan private key ini, sebuah public key bisa dibuat. Itulah
sebabnya mengapa dikatakan private key dan public key saling
berhubungan. Sebuah private key tidak bisa diperoleh dengan
mengotak-atik public key yang bersangkutan. Setelah public key
terbentuk, ia akan dikirimkan oleh pembuatnya kepada orang-
orang yang ingin bertukar pesan dengannya. Karena public key
adalah bukan sesuatu yang rahasia, maka ia bebas disebarkan ke-
pada orang-orang lain, bahkan sekali pun ia jatuh ke tangan yang
keliru, hal itu tidak menjadi masalah.

Gambar 2.3. Pendistribusian public key pada enkripsi asimetris. 83
Pada gambar berikutnya, diilustrasikan John memiliki sebuah pub-
lic key yang dibuat oleh Amy dari sebuah private key. John meng-
gunakan public key tersebut untuk meng-enkrip sebuah pesan ra-
hasia yang ditujukan hanya untuk Amy. Ciphertext yang dihasil-
kan dari proses enkripsi itu kemudian dikirimkan kepada Amy.
Ciphertext yang diterima Amy kemudian di-dekrip-nya mengguna-
kan private key sehingga diperoleh kembali plaintext yang meru-
pakan pesan rahasia yang ditulis John mula-mula.
Jika dalam pengiriman ciphertext seseorang mencurinya dan ber-
usaha membukanya menggunakan public key, hal itu tidak akan
berhasil karena sebuah plaintext yang di-enkrip menggunakan
public key hanya bisa di-dekrip oleh private key yang bersangkut-
an. Sebaliknya, sebuah pesan yang di-enkrip menggunakan sebu-
ah private key, hanya bisa di-dekrip menggunakan public key pa-
sangannya. Inilah yang dimaksud dengan enkripsi asimetris.

Gambar 2.4. Ciphertext hanya bisa dibuka oleh private key.
Berdasarkan cara kerja di atas, maka enkripsi asimetris dipandang
mempunyai tingkat keamanan yang lebih baik dibandingkan en-
kripsi simetris. 84
Pendistribusian public key tidak menjadi masalah krusial, demi-
kian pula dengan pengiriman ciphertext-nya itu sendiri. Namun
demikian, enkripsi asimetris tetap mengandung kelemahan.
Melanjuti contoh sebelumnya, pada saat Devon menyadari bahwa
ia tidak dapat membuka pesan rahasia itu menggunakan public
key yang dimilikinya, kemudian ia berpura-pura menjadi Amy un-
tuk mengelabui John. Berdasarkan private key yang ia buat sen-
diri, kemudian Devon membuat public key yang selanjutnya diki-
rimkan kepada John agar ia meng-enkrip pesan rahasianya sekali
lagi menggunakan public key ini.

Gambar 2.5. Seseorang mendistribusikan public key yang palsu.
John yang tidak menyadari bahwa orang itu sesungguhnya adalah
Devon yang menyamar sebagai Amy, akan menuruti perintahnya
sehingga pesan rahasia itu pun akhirnya berhasil dibaca oleh
Devon. 85
Kelemahan di atas dapat diatasi jika John tahu persis bahwa orang
yang memberi perintah itu adalah sungguh-sungguh Amy. Jika
kita berpikir secara manusiawi, John dan Amy bisa saja saling
bertelepon dahulu sebelum bertukaran data. Hal itu mungkin saja
bisa dilakukan karena John akan mengenal persis suara Amy
yang dikenalnya selama ini, sehingga dia sungguh-sungguh yakin
bahwa orang yang sedang berbicara dengannya memang betul
Amy.
Namun Anda harus memahami kejadian sesungguhnya di dunia
nyata, bahwa pertukaran data pada sistem informasi tidak bekerja
seperti itu. Mesin berbicara dengan mesin, aplikasi berbicara de-
ngan aplikasi, semuanya bekerja berdasarkan logika, tidak ada
perasaan. Untuk menjamin mesin yang satu tidak mengelabui
mesin yang lain, harus ada sesuatu yang menjembatani keduanya.
Ia harus merupakan sesuatu yang dipercaya kredibilitasnya oleh
kedua mesin, sebagai penjamin bagi masing-masing, bahwa
mesin yang ada di seberangnya memang sungguh-sungguh mesin
yang sebenarnya.
Pada prakteknya, penjamin yang dimaksud adalah sebuah lem-
baga yang independen, dikenal secara luas, dan diakui kredibili-
tasnya. Pada ilustrasi sebelumnya, lembaga ini akan mengeluar-
kan sertifikat bagi Amy yang akan ditunjukkan kepada John sebe-
lum mereka bertukaran data. Dengan berbekal kepercayaan John
kepada lembaga tersebut dan keaslian sertifikatnya, maka John
mempercayai bahwa orang yang ada di seberangnya memang
sungguh-sungguh Amy.

Gambar 2.6. Pendistribusian public key melalui lembaga penjamin. 86
Setifikat itu lebih dikenal sebagai public key certificate atau
identity certificate, atau cukup disebut certificate karena di dalam-
nya mengandung sebuah public key dan tanda tangan digital
(digital signature) yang mengaitkan public key tersebut dengan
identitas pembuatnya, yaitu nama atau organisasi, alamat, tanggal
kedaluwarsa, dan sebagainya. Sementara itu, lembaga yang me-
ngeluarkan sertifikat itu disebut Certificate Authority (CA). Bebe-
rapa CA yang telah dikenal secara luas adalah:
• VeriSign, http://www.verisign.com
• Thawte, http://www.thawte.com
• GeoTrust, http://www.geotrust.com
• GoDaddy, http://www.godaddy.com
Salah satu contoh penerapan sertifikat adalah pada protokol
Secure Sockets Layer (SSL), yaitu jalur komunikasi yang aman di
Internet yang umum digunakan untuk otentikasi atau otorisasi
pada transaksi pembayaran. Untuk memudahkan Anda memaha-
mi uraian-uraian di atas, kita akan menggunakan Internet Explorer
sebagai alat peraganya.
1. Buka program “Internet Explorer”, kemudian pilih menu Tools
Æ Internet Options. Pilih tab Content.

Gambar 2.7. Konfigurasi “Internet Options” pada Internet Explorer. 87
2. Pilih tab “Trusted Root Certification Authorities”. Di situ Anda
akan melihat sertifikat-sertifikat yang dikeluarkan oleh bebe-
rapa CA (kolom Issued By) kepada perusahaan-perusahaan
kliennya (kolom Issued To).

Gambar 2.8. Window Certificate pada Internet Explorer.
3. Klik dua kali pada sebuah sertifikat untuk melihat isinya.

Gambar 2.9. Informasi umum sebuah certificate. 88

Gambar 2.10. Informasi detail sebuah certificate.
4. Di situ tampak informasi perusahaan CA yang mengeluarkan
sertifikat ini, kemudian nama organisasi yang dijamin oleh CA
dan tanggal berlakunya sertifikat ini. Pada gambar sebelah ka-
nan, tampak isi dari sertifikat tersebut, salah satunya adalah
public key dan algoritma enkripsinya.
Sampai dengan tahap ini, Anda telah mendapatkan dasar-dasar
pengetahuan mengenai enkipsi. Saya harap Anda dapat mema-
haminya dengan baik, karena uraian tersebut adalah dasar bagi
pembahasan berikutnya. Jika Anda tertarik mempelajari kripto-
grafi lebih lanjut, silakan mulai dari beberapa artikel yang menarik
ini.
• http://www.faqs.org/faqs/cryptography-faq
• http://en.wikipedia.org/wiki/Public_key_certificate
• http://www.database-security.info/Articles/SQLServer/
basics_encryption.asp
Sekarang kita akan masuk pada topik intinya, yaitu bagaimana
enkipsi diterapkan di dalam SQL Server 2005. 89
2.3 Hierarki Enkripsi pada SQL Server 2005
SQL Server 2005 memiliki infrastruktur pengelolaan key, guna
meng-enkrip data berlapis-lapis dalam bentuk hierarki. Setiap la-
pisan meng-enkrip lapisan bawahnya menggunakan kombinasi:
• Certificate
• Asymmetric key
• Symmetric key

Gambar 2.11. Hierarki Enkripsi SQL Server 2005.
Gambar di atas memperlihatkan hierarki enkripsi di dalam SQL
Server 2005. Perhatikan bahwa key pada level yang atas akan me-
nentukan pembentukan key pada lapisan-lapisan di bawahnya.
Dengan demikian, enkripsi data pada setiap lapisan ditentukan
oleh key pada lapisan tersebut dan juga lapisan-lapisan di atasnya. 90
Melihat keadaan ini, sekilas kita bisa yakin bahwa SQL Server
2005 mempunyai mekanisme keamanan data yang sangat baik.
Pertanyaannya sekarang adalah: apakah kita sungguh-sungguh
memerlukan tingkat keamanan setinggi itu? Bagaimana bentuk
hierarki tersebut dapat meningkatkan keamanan data?
Untuk menjawab pertanyaan di atas, pertama-tama saya perlu
menegaskan bahwa saya tidak mengatakan hierarki enkripsi yang
diusung oleh Microsoft ini memiliki tingkat keamanan yang terbaik
dibandingkan mekanisme-mekanisme keamanan data yang ada.
Namun menurut pengamatan saya, tingkat keamanan enkripsi pa-
da SQL Server 2005 bisa diandalkan karena wujudnya yang ber-
lapis-lapis akan menyulitkan seseorang untuk menembusnya.
Terlepas dari fakta apakah Anda belum pernah mengalami se-
orang cracker menyusup ke dalam sistem Anda, atau seseorang
membongkar data rahasia perusahaan, saya menganjurkan Anda
untuk tidak memandang remeh kreativitas dan kegigihan seorang
cracker. Sebagai contoh, saya bisa membuktikan adanya celah
keamanan pada enkripsi SQL Server 7 dan SQL Server 2000.
Dengan beberapa langkah sederhana, stored procedure, view atau
trigger yang dibuat dan di-enkrip menggunakan opsi “WITH EN-
CRYPTION” dapat dibongkar, sehingga semua skripnya bisa di-
baca dengan jelas. Contoh lainnya adalah login-login ID SQL Ser-
ver dan password-nya dapat di-copy dari satu server ke server lain
dengan perintah-perintah T-SQL. Menurut Anda bagaimana ting-
kat keamanan SQL Server pada versi-versi sebelumnya?
Di luar itu semua, saya percaya bahwa model enkripsi pada SQL
Server 2005 adalah usulan terbaik dari pengalaman sebelumnya
dan hasil riset para ahli-ahli di Microsoft. Anda perlu menyadari
bahwa bagaimanapun, enkripsi hanyalah salah satu cara pening-
katan keamanan data. Kita tidak bisa berlebihan menerapkan la-
pisan enkripsi dalam jumlah yang lebih banyak, karena hal itu
hanya akan mengorbankan unjuk kerja sistem tanpa adanya pe-
ningkatan keamanan yang terlalu berarti. Faktanya, pengamanan
data harus diupayakan dari banyak sisi, baik dari sisi software,
hardware, manusia, hingga sistem dan prosedurnya. Semuanya itu
harus dilakukan secara optimal agar keseimbangan antara efek-
tifitas dan efisiensi bisa dicapai. 91
2.3.1 Data Protection API
Kembali pada gambar hierarki enkipsi sebelumnya, tampak bahwa
lapisan puncak dari sistem keamanan data ini adalah sistem ope-
rasi di mana Windows Data Protection API (DPAPI) berperan.
DPAPI adalah antarmuka pemrograman proteksi data yang mulai
ditambahkan ke dalam sistem-sistem operasi berbasis Windows
sejak Windows 2000 yang diimplementasikan dalam bentuk static
library bernama Crypt32.lib dan sebuah dynamic link library
(DLL) bernama Crypt32.dll.
DPAPI memberikan layanan-layanan proteksi data pada tingkat
sistem operasi kepada pengguna dan proses-proses sistem. Hal ini
berarti programmer dapat menggunakan layanan yang dimiliki
oleh sistem operasi ini tanpa membutuhkan komponen-komponen
tambahan. DPAPI adalah layanan yang sangat mudah digunakan
dan ini memberikan keuntungan kepada para programmer yang
ingin menggunakannya untuk melindungi data-data aplikasinya
yang sensitif seperti password dan private key.
DPAPI adalah layanan proteksi data berbasis password, artinya ia
menggunakan sebuah password untuk melakukan proteksi. Kele-
mahan dari metode ini tentunya adalah semua sistem proteksinya
bergantung pada password tersebut. Namun hal itu tidak menjadi
masalah karena DPAPI menggunakan rutin-rutin kriptografi yang
sudah teruji, yaitu algoritma Triple-DES dan key-key yang kuat.
Karena fokus DPAPI adalah memberikan proteksi kepada peng-
guna menggunakan sebuah password, maka secara logika ia bisa
menggunakan password logon pengguna yang bersangkutan un-
tuk melakukan proteksinya.
Untuk memberikan gambaran bagaimana DPAPI bekerja, berikut
ini diperlihatkan sebuah contoh program yang akan meng-enkrip
sebuah pesan dan men-dekripnya kembali menggunakan fungsi-
fungsi yang ada di dalam Crypt32.dll.
Hal yang pertama harus dilakukan sebelum memanggil fungsi-
fungsi tersebut adalah mengimplementasikan structure yang men-
jadi kemasan data dalam mengirimkan parameter kepada setiap
fungsi. 92
Structure yang pertama adalah unmanaged DATA_BLOB yang
memiliki dua member, yaitu sebuah pointer kepada sebuah data
stream dan ukuran dari data stream tersebut. Contoh implemen-
tasinya adalah sebagai berikut.
public struct DataBlob
{
public int Size;
public IntPtr Data;
}

Structure kedua, unmanaged CRYPTPROTECT_PROMPTSTRUCT
yang memiliki empat buah member, yaitu sebuah integer yang
mewakili ukuran struktur tersebut, sebuah flag, sebuah pointer ke
window yang menampilkan pesan, dan pesan yang akan ditampil-
kan itu sendiri. Contoh implementasinya adalah sebagai berikut.
public struct CryptProtectPromptStruct
{
public int Size;
public int Flags;
public IntPtr Window;
public String Message;
}

Untuk saat ini, mungkin Anda masih belum memahami bagaima-
na cara menggunakan structure ini. Jangan khawatir, sampai
tahap ini saya hanya ingin menggambarkan pada Anda bagai-
mana caranya mengemas data agar dapat dikirim sebagai para-
meter kepada fungsi-fungsi di dalam Crypt32.dll.
Langkah berikutnya adalah mengenai fungsi-fungsi di dalam DLL
tersebut. Ada dua fungsi yang dapat digunakan dalam kaitannya
dengan proteksi data, yaitu CryptProtectData dan CryptUnprotect-
Data yang masing-masing dipanggil untuk meng-enkrip dan men-
dekrip data. Selanjutnya, saya akan mengajak Anda untuk mem-
perhatikan skrip di bawah ini baris demi baris untuk melihat bagai-
mana uraian yang telah dijelaskan di atas diaplikasikan dalam
bentuk sebuah program C# sederhana.
Skrip 2.1. Class1.cs.

using System;
using System.Runtime.InteropServices;
using System.IO;
using System.Text; 93

namespace DPAPI_Test
{
///
/// Summary description for Class1.
///

///
public struct DataBlob
{
public int Size;
public IntPtr Data;
}

public struct CryptProtectPromptStruct
{
public int Size;
public int Flags;
public IntPtr Window;
public string Prompt;
}

public sealed class DataProtection
{
[DllImport("crypt32.dll",
EntryPoint="CryptProtectData", CharSet=CharSet.Unicode)]
public static extern bool Encrypt(
ref DataBlob dataIn,
String description,
ref DataBlob optionalEntropy,
IntPtr reserved,
ref CryptProtectPromptStruct promptStruct,
int flags,
out DataBlob dataOut
);

[DllImport("crypt32.dll",
EntryPoint="CryptUnprotectData", CharSet=CharSet.Unicode)]
public static extern bool Decrypt(
ref DataBlob dataIn,
String description,
ref DataBlob optionalEntropy,
IntPtr reserved,
ref CryptProtectPromptStruct promptStruct,
int flags,
out DataBlob dataOut
);
}
class Class1
{
///
/// The main entry point for the application.
///

[STAThread]
static void Main(string[] args)
{
// 94
// TODO: Add code to start application here
//
// Set the confidential data
String plainText = "This data is extremly
confidential. For your eyes only.",
DecryptedText="";
Byte[] plainTextBytes =
Encoding.Unicode.GetBytes(plainText);
Console.WriteLine(plainText);
Console.ReadLine();

// Set up the DATA_BLOB structure for the input
data
DataBlob inputBlob = new DataBlob();
inputBlob.Data =
Marshal.AllocHGlobal(plainTextBytes.Length);
inputBlob.Size = plainTextBytes.Length;
Marshal.Copy(plainTextBytes, 0, inputBlob.Data,
inputBlob.Size);

// Set up the CRYPTPROTECT_PROMPTSTRUCT structure
CryptProtectPromptStruct promptStruct = new
CryptProtectPromptStruct();
promptStruct.Prompt = null;
promptStruct.Window = IntPtr.Zero;
promptStruct.Flags = 0;
promptStruct.Size =
Marshal.SizeOf(typeof(CryptProtectPromptStruct));

// Set up the DATA_BLOB structure for the
optional entropy
DataBlob optionalEntropy = new DataBlob();
optionalEntropy.Data = IntPtr.Zero;
optionalEntropy.Size = 0;

// Set up the DATA_BLOB structure for the output
data
DataBlob outputBlob = new DataBlob();

// Encrypt the data
bool success = DataProtection.Encrypt(ref
inputBlob, null, ref optionalEntropy, IntPtr.Zero, ref
promptStruct, 0, out outputBlob);
Byte[] encryptedDataBytes=new
Byte[outputBlob.Size];
Marshal.Copy(outputBlob.Data, encryptedDataBytes,
0, outputBlob.Size);

Console.WriteLine(Encoding.Unicode.GetString(encryptedDat
aBytes));
Console.ReadLine();

// Decrypt the data
DataBlob decryptedBlob = new DataBlob();
success = DataProtection.Decrypt(ref outputBlob,
null, ref optionalEntropy, IntPtr.Zero, ref promptStruct, 95
0, out decryptedBlob);
// Verify that the decrypted data is the same as
the original data
Byte[] decryptedDataBytes=new
Byte[decryptedBlob.Size];
Marshal.Copy(decryptedBlob.Data,
decryptedDataBytes, 0, decryptedBlob.Size);
DecryptedText =
Encoding.Unicode.GetString(decryptedDataBytes);
Console.WriteLine(DecryptedText);
Console.ReadLine();
}
}
}

Beberapa baris pertama berisi perintah-perintah deklarasi structure
DataBlob dan CryptProtectPromptStruct seperti yang telah dibica-
rakan sebelumnya. Di bawahnya tampak fungsi CryptProtectData
dan CryptUnprotectData dari Crypt32.dll dimuat ke dalam class
DataProtection dengan perintah “DllImport("crypt32.dll", ...”).
Rutin utama dari program ini terdapat di dalam Class1. Variabel
plainText yang merupakan sebuah String berisi pesan rahasia
yang akan di-enkrip, yaitu “This data is extremly confidential. For
your eyes only”. Melalui array plainTextBytes, isi variabel plain-
Text dikonversi menjadi tipe data DataBlob, yang diwakili oleh
variabel inputBlob. Akhirnya inputBlob di-enkrip pada baris di ba-
wah ini dan menghasilkan data yang terproteksi di dalam variabel
outputBlob.
...
// Encrypt the data
bool success = DataProtection.Encrypt(ref inputBlob, null, ref
optionalEntropy, IntPtr.Zero, ref promptStruct, 0, out
outputBlob);
...
Sementara itu, proses kebalikannya untuk men-dekrip data yang
terproteksi itu tampak pada baris di bawahnya dan hasilnya ditam-
pung dalam variabel decryptedBlob.
...
// Decrypt the data
DataBlob decryptedBlob = new DataBlob();
success = DataProtection.Decrypt(ref outputBlob, null, ref
optionalEntropy, IntPtr.Zero, ref promptStruct, 0, out
decryptedBlob);
... 96

Dengan menampilkan isi dari variabel-variabel tersebut, tampak
bahwa teks di dalam decryptedBlob sama persis dengan variabel
plainText mula-mula.

Gambar 2.12. Contoh enkripsi dan dekripsi menggunakan DPAPI.
2.3.2 Service Master Key
Merujuk kembali pada gambar hierarki enkipsi sebelumnya, lapis-
an kedua dari hierarki tersebut adalah SQL Server di mana Service
Master Key ditempatkan. Service Master Key adalah akar dari hie-
rarki enkipsi. Key ini dibuat secara otomatis pada saat sebuah
instance SQL Server 2005 diinstal. Service Master Key itu sendiri
dibuat menggunakan Data Protection API (DPAPI). Berdasarkan
cara kerjanya, DPAPI membutuhkan sebuah password untuk men-
jalankan operasi-operasinya, oleh karena itu penggunaan pass-
word service account adalah sebuah cara yang umum digunakan.
Sesungguhnya DPAPI menggunakan identitas logon atau logon
credential dari service account yang bersangkutan. Pada sebuah
sistem dimana sebuah account log on menggunakan smart card
misalnya, maka mekanismenya akan sedikit berbeda. Namun un-
tuk menyederhanakan, kita tetap akan menggunakan istilah pass-
word account untuk merujuk ke credential.
97
Di dalam prosesnya, mula-mula DPAPI membuat sebuah key yang
kuat yang disebut dengan Master Key, yang diproteksi oleh pass-
word account. Pada langkah berikutnya, DPAPI menggunakan pro-
ses kriptografi standar yang disebut Password-Based Key Deri-
vation untuk membuat key yang lain berdasarkan password.
Akhirnya key ini digunakan untuk meng-enkrip Master Key meng-
gunakan algoritma Triple-DES yang hasilnya disimpan di dalam di-
rektori profil account tersebut.
Master Key tidak digunakan secara eksplisit untuk memproteksi
data, namun Master Key digunakan untuk membuat key-key lain
(yang disebut dengan session key) yang masing-masing diguna-
kan untuk melakukan enkripsi simetris atau enkripsi asimetris
terhadap data-data tersebut. Untuk alasan keamanan, Master Key
akan kedaluwarsa pada waktu tertentu (biasanya setiap tiga bu-
lan). Jika hal itu terjadi, maka sebuah Master Key baru akan di-
buat lagi dan rutin yang sama akan diterapkan lagi. Masa aktif
Master Key yang dibatasi akan menyulitkan seorang penyusup
mendapatkan Master Key dan mengakses semua data rahasia.
Namun bagaimana SQL Server dapat membuka kembali data
yang diproteksi menggunakan session key dari Master Key yang
sudah kedaluwarsa? Pertama, DPAPI tidak menghapus Master Key
yang kedaluwarsa, tetapi disimpan selamanya di dalam direktori
profil account yang bersangkutan. Kedua, DPAPI menyimpan Glo-
bally Unique Identifier (GUID) dari setiap Master Key di dalam da-
ta yang diproteksi, sehingga DPAPI selalu tahu Master Key mana
yang harus digunakan untuk membuka proteksi data tersebut.
Pertanyaan selanjutnya, bagaimana jika account yang bersangkut-
an mengganti password-nya? Bukankah Master Key berhubungan
erat dengan password account yang membuatnya? Pertama,
DPAPI bekerja sama dengan modul penggantian password, se-
hingga pada saat password berubah, semua Master Key di-enkrip
kembali menggunakan password yang baru. Kedua, sistem me-
nyimpan sebuah file yang disebut "Credential History" di dalam di-
rektori profil account. Ketika account mengganti password-nya,
password yang lama ditambahkan pada baris teratas dari file ini,
kemudian file tersebut di-enkrip menggunakan password yang
baru. 98
Mem-backup Service Master Key
Mengingat perannya yang sangat penting sebagai akar dari semua
hierarki enkripsi, Service Master Key harus di-backup dan disim-
pan pada lokasi yang terpisah dan aman. Membuat backup ini
adalah salah satu pekerjaan administrasi utama yang harus dilaku-
kan pada server tersebut. Karena Service Master Key bisa berubah
secara periodik berdasarkan tanggal kedaluwarsanya, maka akti-
vitas mem-backup key ini sebaiknya dilakukan sesering mungkin.
Perintah T-SQL untuk melakukan backup Service Master Key di-
perlihatkan di bawah ini.
BACKUP SERVICE MASTER KEY TO FILE = 'path_to_file'
ENCRYPTION BY PASSWORD = 'password'

Keterangan:
FILE =
'path_to_file'
Menetapkan nama dan lokasi file di mana Service
Master Key akan di-backup. Lokasi ini bisa berupa
local path atau network path.
PASSWORD =
'password'
Password yang digunakan untuk meng-enkrip Service
Master Key di dalam file backup.
Contoh:
BACKUP SERVICE MASTER KEY TO FILE = 'c:\SVCMSTKEY.SMK'
ENCRYPTION BY PASSWORD = 'mypassword'

Di bawah ini adalah contoh isi file backup Service Master Key yang
dibuka menggunakan Notepad.

Gambar 2.13. Contoh isi file backup Service Master Key. 99
Me-restore Service Master Key
Jika diperlukan, file backup Service Master Key dapat di-restore ke
dalam sebuah SQL Server dengan perintah berikut ini.
RESTORE SERVICE MASTER KEY FROM FILE = 'path_to_file'
DECRYPTION BY PASSWORD = 'password' [FORCE]

Keterangan:
FILE =
'path_to_file'
Menetapkan nama dan lokasi file di mana file backup
Service Master Key akan di-restore. Lokasi ini bisa
berupa local path atau network path.
PASSWORD =
'password'
Password yang digunakan untuk men-dekrip Service
Master Key di dalam file backup.
FORCE Memaksa penggantian Service Master Key yang se-
karang ada pada server, dengan key yang di-restore,
walaupun dengan resiko kehilangan data.
Contoh:
RESTORE SERVICE MASTER KEY FROM FILE = 'c:\SVCMSTKEY.SMK'
DECRYPTION BY PASSWORD = 'mypassword'

Pada saat Service Master Key di-restore, SQL Server men-dekrip
semua key yang telah di-enkrip dengan Service Master Key yang
sebelumnya, dan meng-enkrip kembali menggunakan Service
Master Key yang dimuat dari file backup tersebut. Jika terjadi ke-
gagalan pada salah satu proses dekripsi, seluruh proses restore
dibatalkan. Proses restore dapat dipaksakan untuk tetap dijalan-
kan dengan menggunakan opsi FORCE, namun hal ini beresiko
kehilangan data.
Service Master Key adalah akar dari semua hierarki enkripsi SQL
Server. Service Master Key secara langsung atau tidak langsung
mengamankan semua key di dalam struktur itu. Jika sebuah key
tidak dapat di-dekrip sewaktu proses restore, maka data yang di-
proteksi oleh key tersebut akan hilang. Proses restore akan meng-
akibatkan SQL Server membuat kembali hierarki enkripsi dari
awal dan hal ini sangat menyita sumber daya server. Oleh karena
itu, proses ini harus dijadwalkan pada saat aktivitas server rendah. 100
2.3.3 Database Master Key
Service Master Key adalah sesuatu yang dibuat secara otomatis
pada saat instalasi sebuah instance SQL Server. Tidak banyak
yang bisa dilakukan dengan key itu kecuali mem-backup-nya. Pa-
da lapisan berikutnya di bawah lapisan SQL Server pada hierarki
enkripsi SQL Server 2005 adalah lapisan database yang di dalam-
nya terdapat sebuah key yang dinamakan Database Master Key.
Berbeda dengan Service Master Key, Database Master Key secara
default belum ada pada sebuah database, sehingga ia harus dibuat
secara eksplisit oleh seorang administrator.
Database Master Key adalah sebuah symmetric key (akan dijelas-
kan beberapa saat lagi) yang digunakan untuk memproteksi pri-
vate key dari certificate-certificate dan asymmetric key yang ada
di dalam database yang bersangkutan. Master key ini dibuat de-
ngan algoritma enkripsi Triple DES dan dilengkapi dengan sebuah
password yang ditentukan oleh pembuatnya. Untuk memungkin-
kan dekripsi otomatis dari Database Master Key ini, sebuah dupli-
kat key ini di-enkrip menggunakan Service Master Key dan disim-
pan pada dua tempat, yaitu pada database yang bersangkutan dan
di database master.
Sintaks untuk membuat sebuah Database Master Key adalah se-
bagai berikut.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'

Password tidak dapat diabaikan karena ia diperlukan untuk meng-
enkrip master key tersebut di dalam database.
Contoh:
USE AdventureWorks
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MyP4ssw0rd'

Untuk mengetahui apakah di dalam sebuah database terdapat se-
buah master key atau tidak, silakan jalankan sebuah query ter-
hadap view sys.symmetric_keys.
SELECT * FROM sys.symmetric_keys


101
Output:
name principal_id symmetric_key_id key_length algorithm_desc
------------------------ ------------ ---------------- ----------- -------------- ...
##MS_DatabaseMasterKey## 1 101 128 TRIPLE_DES

(1 row(s) affected)

Pada hasil query di atas, tampak database ini telah terbentuk se-
buah Database Master Key. Jika master key ini dihapus, maka in-
formasinya juga akan hilang dari view sys.symmetric_keys.
DROP MASTER KEY
GO
SELECT * FROM sys.symmetric_keys
Output:
name principal_id symmetric_key_id key_length algorithm_desc
------------------------ ------------ ---------------- ----------- -------------- ...

(0 row(s) affected)
Setelah membuat sebuah Database Master Key, barulah enkripsi
dapat dilakukan dengan menggunakan symmetric key, asymmet-
ric key, atau dengan sebuah certificate.
2.3.4 Symmetric Key
Sebuah symmetric key dibuat menggunakan perintah “CREATE
SYMMETRIC KEY” dengan sintaks sebagai berikut.
CREATE SYMMETRIC KEY key_name [ AUTHORIZATION owner_name ]
WITH [ , ... n ]
ENCRYPTION BY [ , ... n ]
Keterangan:
key_name Nama yang unik di dalam database untuk sym-
metric key ini.
AUTHORIZATION
owner_name
Opsional. Nama dari database user atau appli-
cation role yang memiliki key ini.
Pilihan key_options adalah opsi-opsi yang salah satunya harus di-
gunakan di dalam perintah di atas. Beberapa opsi juga bisa digu-
nakan bersamaan dan masing-masing dipisahkan dengan tanda
koma. 102
KEY_SOURCE =
'pass_phrase'
Sebuah frase yang akan dilibatkan dalam
pembuatan key tersebut. Contoh:
KEY_SOURCE = 'The square of the hypote-
nuse is equal to the sum of the squares of the
sides'
ALGORITHM =

Algoritma yang digunakan untuk enkripsi. Pili-
hannya adalah:
• DES
• TRIPLE_DES
• RC2
• RC4
• DESX
• AES_128
• AES_192
• AES_256
IDENTITY_VALUE =
'identity_phrase'

Opsional. Sebuah pengenal untuk frase yang
ditetapkan pada opsi KEY_SOURCE. Contoh:
IDENTITY_VALUE = 'Pythagoras'
Pilihan encrypting_mechanism adalah cara yang harus dipilih sa-
lah satunya untuk meng-enkrip key yang akan dibuat.
CERTIFICATE
certificate_name
Nama certificate yang akan digunakan untuk
meng-enkrip symmetric key ini. Certificate tersebut
harus sudah ada terlebih dahulu di dalam database.
PASSWORD =
'password'
Sebuah password yang akan meningkatkan kea-
manan symmetric key tersebut. Kompleksitas
password akan diuji oleh SQL Server untuk me-
mastikan kekuatan password tersebut.
SYMMETRIC KEY
symmetric_key_n
ame
Nama symmetric key yang akan digunakan untuk
meng-enkrip symmetric key ini. Key tersebut harus
sudah ada terlebih dahulu di dalam database dan
harus dibuka dulu sebelum digunakan.
ASYMMETRIC Nama asymmetric key yang akan digunakan untuk 103
KEY
asym_key_name
meng-enkrip symmetric key ini. Key tersebut harus
sudah ada terlebih dahulu di dalam database.
Contoh:
CREATE SYMMETRIC KEY MySymKey01
WITH KEY_SOURCE = 'The square of the hypotenuse is equal to
the sum of the squares of the sides',
IDENTITY_VALUE = 'Pythagoras',
ALGORITHM = AES_256
ENCRYPTION BY PASSWORD = 'p4ssw0rd'
Perintah di atas akan membuat sebuah symmetric key yang ber-
nama MySymKey01. Perhatikan bahwa perintah ini mengandung
opsi key_options berupa KEY_SOURCE, IDENTITY_VALUE, dan
ALGORITHM. Sementara itu, opsi encrypting_mechanism yang di-
pilih adalah PASSWORD karena saat ini di dalam database ter-
sebut tidak terdapat key yang lain.
Untuk melihat symmetric key yang ada di dalam sebuah database,
sekali lagi silakan menjalankan sebuah query terhadap view
sys.symmetric_keys. Anda akan melihat key-key yang lain di luar
Database Master Key yang telah dibuat pertama kali.
SELECT * FROM sys.symmetric_keys
Output:
name principal_id symmetric_key_id key_length algorithm_desc
------------------------ ------------ ---------------- ----------- -------------- ...
##MS_DatabaseMasterKey## 1 101 128 TRIPLE_DES
MySymKey01 1 256 256 AES_256

(2 row(s) affected)
Sekarang kita akan mencoba membuat symmetric key yang ke-
dua dengan menggunakan symmetric key yang pertama sebagai
pilihan mekanisme enkripsinya.
Skrip 2.2. Skrip SQL.

USE AdventureWorks
GO
OPEN SYMMETRIC KEY MySymKey01 DECRYPTION BY PASSWORD =
'p4ssw0rd'

CREATE SYMMETRIC KEY MySymKey02
WITH ALGORITHM = RC4 104
ENCRYPTION BY SYMMETRIC KEY MySymKey01

CLOSE SYMMETRIC KEY MySymKey01

Pada baris pertama tampak bahwa symmetric key MySymKey01
harus dibuka sebelum ia bisa digunakan untuk meng-enkrip sebu-
ah data. Ia harus dibuka sesuai dengan cara ia di-enkrip, yaitu de-
ngan menggunakan sebuah password.
Selanjutnya symmetric key kedua bernama MySymKey02 dibuat
dengan opsi key_options ALGORITHM = RC4 dan opsi encrypt-
ing_mechanism adalah SYMMETRIC KEY MySymKey01. Akhirnya
symmetric key MySymKey01 ditutup kembali setelah selesai di-
gunakan. Symmetric key MySymKey02 sekarang telah terbentuk
di dalam database. Jalankan lagi sebuah query terhadap view
sys.symmetric_keys untuk melihat symmetric key yang ada di
dalamnya.
SELECT * FROM sys.symmetric_keys
Output:
name principal_id symmetric_key_id key_length algorithm_desc
------------------------ ------------ ---------------- ----------- -------------- ...
##MS_DatabaseMasterKey## 1 101 128 TRIPLE_DES
MySymKey01 1 256 256 AES_256
MySymKey02 1 257 40 RC4

(3 row(s) affected)
Untuk menghapus sebuah symmetric key, silakan jalankan perin-
tah dengan sintaks di bawah ini.
DROP SYMMETRIC KEY symmetric_key_name
Keunggulan symmetric key dibandingkan asymmetric key ada pa-
da unjuk kerjanya. Symmetric key kira-kira 1.000 sampai 10.000
kali lebih cepat dibandingkan asymmetric key. Sementara itu kele-
mahannya adalah kenyataan bahwa hanya sebuah key yang digu-
nakan untuk enkripsi dan dekripsi, dimana kedua pihak harus me-
ngetahui key ini.
Contoh penerapan dari pembuatan sebuah symmetric key diper-
lihatkan pada skrip berikut ini. 105
Sebelum bisa digunakan untuk meng-enkrip sebuah teks, sebuah
symmetric key harus dibuka terlebih dahulu dengan menggunakan
perintah “OPEN SYMMETRIC KEY”. Pada contoh ini akan diguna-
kan key MySymKey01 yang telah dibuat pada langkah sebelum-
nya. Proses enkripsi sebuah data menggunakan symmetric key di-
lakukan dengan pemanggilan fungsi EncryptByKey. Dua para-
meter yang diperlukan oleh fungsi ini adalah Globally Unique Iden-
tifier (GUID) dari key yang bersangkutan, dan plaintext yang akan
di-enkrip itu sendiri.
Hasil pemanggilan fungsi EncryptByKey adalah sebuah ciphertext
yang berbentuk data bertipe varbinary. Untuk mendapatkan kem-
bali plaintext dari ciphertext tersebut, bisa digunakan fungsi
DecryptByKey dengan cara mengirimkan ciphertext yang bersang-
kutan sebagai parameternya. Sekali lagi, hasil dekripsi ini juga se-
buah data bertipe varbinary, sehingga ia harus dikonversi dengan
perintah CONVERT(nvarchar, ...) untuk mendapatkan teks asli-
nya.
Skrip 2.3. Skrip SQL.

USE AdventureWorks
GO

DECLARE @ciphertext varbinary(8000),
@plaintext varchar(15),
@decrypted varchar(15)

OPEN SYMMETRIC KEY MySymKey01 DECRYPTION BY PASSWORD =
'p4ssw0rd'

SELECT @plaintext=NationalIDNumber,
@ciphertext=EncryptByKey(Key_GUID('MySymKey01'),
NationalIDNumber)
FROM HumanResources.Employee
WHERE EmployeeID=1

SELECT @plaintext AS 'Plain Text',@ciphertext AS 'Encrypted
Text'

SELECT CONVERT(nvarchar,DecryptByKey(@ciphertext) ) AS
'Decrypted Text'

CLOSE SYMMETRIC KEY MySymKey01

106
Output:
Plain Text Encrypted Text
--------------- ----------------------------------------------------------------
14417807 0x00D19B42BC3311E4819DCF5EE69053BE010000000E82C5DAB177E947B247F9 ...

(1 row(s) affected)

Decrypted Text
------------------------------
14417807

(1 row(s) affected)


Jika fungsi EncryptByKey atau DecryptByKey dijalankan tanpa
terlebih dahulu membuka symmetric key yang bersangkutan de-
ngan menggunakan perintah “OPEN SYMMETRIC KEY”, maka ha-
sil enripsi dan dekripsinya bernilai NULL.
2.3.5 Asymmetric Key
Sebuah symmetric key dibuat menggunakan perintah “CREATE
ASYMMETRIC KEY” dengan sintaks sebagai berikut.
CREATE ASYMMETRIC KEY key_name
[ AUTHORIZATION database_principal_name ]
{
FROM
|
WITH ALGORITHM = { RSA_512 | RSA_1024 | RSA_2048 }
}
ENCRYPTION BY PASSWORD = 'password'
Keterangan:
key_name Nama yang unik di dalam database untuk
asymmetric key ini.
AUTHORIZATION
database_principal_name
Nama pemilik asymmetric key ini. Pemilik
tidak boleh merupakan sebuah role atau
sebuah group. Jika parameter ini diabai-
kan, maka pemilik adalah pembuat key ini.
PASSWORD =
'password'
Password yang digunakan untuk meng-
enkrip private key. Jika parameter ini di-
abaikan, maka private key di-enkrip meng-
gunakan Database Master Key. 107
Pilihan key_source adalah sumber di mana sepasang asymmetric
key akan dimuat.
FILE = 'path_to_strong-
name_file'
Lokasi dan nama file dari mana se-
pasang key akan dimuat.
EXECUTABLE FILE =
'path_to_executable_file'
Lokasi dan nama file assembly dari
mana public key akan dimuat.
ASSEMBLY assembly_name Nama assembly dari mana public key
akan dimuat.
Panjang private key bisa berupa 512, 1024, atau 2048 bit. Pilihan
ini ditentukan pada opsi WITH ALGORITHM di mana nilainya bisa
dipilih antara RSA_512, RSA_1024, atau RSA_2048.
Sebuah asymmetric key secara default mengandung pasangan
public key dan private key. Ketika ia dibuat tanpa menggunakan
opsi FROM, perintah CREATE ASYMMETRIC KEY menghasilkan
sebuah pasangan key yang baru. Tapi jika dibuat menggunakan
opsi FROM, perintah tersebut akan meng-import sepasang key
dari sebuah file, atau meng-import sebuah public key dari sebuah
assembly.
Secara default, private key diproteksi dengan Database Master
Key. Jika Database Master Key belum dibuat, maka password
adalah keharusan karena ia digunakan untuk memproteksi private
key. Jika Database Master Key telah ada, maka password adalah
opsional.
Contoh:
CREATE ASYMMETRIC KEY MyAsymKey01
WITH ALGORITHM = RSA_2048
ENCRYPTION BY PASSWORD = 'p4ssw0rd'
Perintah di atas akan membuat sebuah asymmetric key dengan
nama MyAsymKey01. Untuk melihat asymmetric key yang ada di
dalam sebuah database, silakan menjalankan sebuah query ter-
hadap view sys.asymmetric_keys.
SELECT [name], principal_id, asymmetric_key_id,
pvt_key_encryption_type_desc, algorithm_desc
FROM sys.asymmetric_keys 108
Output:
name principal asymmetric pvt_key_encryption_type_desc algorithm_desc
key_length
_id _key_id
----------- --------- ---------- ---------------------------- -------------- ---------
-
MyAsymKey01 1 256 ENCRYPTED_BY_PASSWORD RSA_2048 2048

(1 row(s) affected)
Pada contoh yang kedua akan diperlihatkan bagaimana cara
membuat sebuah asymmetric key dengan memuat pasangan pub-
lic key dan private key dari sebuah file. Hal yang pertama-tama
harus dilakukan adalah membuat sebuah signature key file, yaitu
sebuah file yang berisi sepasang key itu.
Sebuah signature key file bisa dibuat dengan menggunakan Visual
Studio. Pada kesempatan ini saya menggunakan Visual Studio
.NET 2003. Sekali pun belum pernah menggunakan versi yang
lebih baru, tapi saya yakin hal yang sama bisa juga dilakukan
pada Visual Studio terbaru.
1. Buka window “Visual Studio .NET 2003 Command Prompt”
melalui menu Start Æ All Programs Æ Microsoft Visual
Studio .NET 2003 Æ Visual Studio .NET Tools.
2. Silakan ketik perintah di bawah ini pada command prompt
untuk menghasilkan sebuah signature key file.
sn -k
Opsi –k akan membuat sepasang public key dan private key,
dan menuliskannya ke dalam sebuah file.
Contoh:
sn -k c:\sqlcrypt\keypair.snk 109

Gambar 2.14. Membuat sebuah signature key file.
Setelah signature key file itu berhasil dibuat, maka file ini dapat di-
muat bersamaan dengan pembuatan sebuah asymmetric key de-
ngan perintah SQL sebagai berikut.
CREATE ASYMMETRIC KEY MyAsymKey02
FROM FILE='c:\sqlcrypt\keypair.snk'
Jika sebuah query dijalankan kembali terhadap table sys.asym-
metric_keys, tampak bahwa key ini telah terbentuk dengan baik.
Karena pembuatannya tidak disertai dengan sebuah password,
maka Database Master Key digunakan untuk meng-enkrip key
tersebut.
name principal asymmetric pvt_key_encryption_type_desc algorithm_desc key_length
_id _key_id
----------- --------- ---------- ---------------------------- -------------- ----------
MyAsymKey01 1 256 ENCRYPTED_BY_PASSWORD RSA_2048 2048
MyAsymKey02 1 261 ENCRYPTED_BY_MASTER_KEY RSA_1024 1024

(2 row(s) affected)
Untuk menghapus sebuah asymmetric key, silakan jalankan perin-
tah dengan sintaks di bawah ini.
DROP ASYMMETRIC KEY asymmetric_key_name
Contoh penerapan dari pembuatan sebuah asymmetric key diper-
lihatkan pada skrip berikut ini. Proses enkripsi sebuah data meng-
gunakan asymmetric key dilakukan dengan pemanggilan fungsi
EncryptByAsymKey. Dua parameter yang diperlukan oleh fungsi
ini adalah kode pengenal dari assymetric key yang bersangkutan,
diperoleh dengan bantuan fungsi AsymKey_ID dan plaintext yang
akan di-enkrip itu sendiri. 110
Hasil pemanggilan fungsi EncryptByAsymKey adalah sebuah
ciphertext yang berbentuk data bertipe varbinary. Untuk menda-
patkan kembali plaintext dari ciphertext tersebut, fungsi Decrypt-
ByAsymKey bisa digunakan dengan cara mengirimkan kode pe-
ngenal dari assymetric key tersebut sebagai parameternya, diikuti
ciphertext yang bersangkutan dan password yang digunakan un-
tuk membuat assymetric key itu. Sekali lagi, hasil dekripsi ini juga
sebuah data bertipe varbinary sehingga ia harus dikonversi dengan
perintah CONVERT(nvarchar, ...) untuk mendapatkan teks asli-
nya.

/*
CREATE ASYMMETRIC KEY MyAsymKey01
WITH ALGORITHM = RSA_2048
ENCRYPTION BY PASSWORD = 'p4ssw0rd'
*/

DECLARE @ciphertext varbinary(8000),
@plaintext varchar(15),
@decrypted varchar(15)

SELECT @plaintext=NationalIDNumber,
@ciphertext=EncryptByAsymKey(AsymKey_ID('MyAsymKey01'),
NationalIDNumber)
FROM HumanResources.Employee
WHERE EmployeeID=1

SELECT @plaintext AS 'Plain Text',@ciphertext AS 'Encrypted
Text'

SELECT
CONVERT(nvarchar,DecryptByAsymKey(AsymKey_ID('MyAsymKey01')
,
@ciphertext,N'p4ssw0rd') ) AS 'Decrypted Text'

Output:
Plain Text Encrypted Text
--------------- ------------------------------------------------------------------
14417807 0x08E0B547FAB2AF39B84AE8FD1C50F163556A0C06B30550A0BF6BA804A805C4D9 ...

(1 row(s) affected)

Decrypted Text
------------------------------
14417807

(1 row(s) affected)




111
2.3.6 Certificate
Sebuah certificate dibuat menggunakan perintah “CREATE CERTI-
FICATE” dengan sintaks sebagai berikut.
CREATE CERTIFICATE certificate_name [ AUTHORIZATION user_name
]
[ ENCRYPTION BY PASSWORD = 'password']
WITH SUBJECT = 'certificate_subject_name'
[ , START_DATE = 'yyyy/mm/dd' | EXPIRY_DATE = 'yyyy/mm/dd']
Keterangan:
certificate_name Nama yang unik di dalam database untuk
certificate ini.
AUTHORIZATION
user_name
Nama user yang menjadi pemilik certifi-
cate ini. Jika parameter ini diabaikan, ma-
ka pemilik adalah pembuat certificate ini.
PASSWORD = 'password' Password yang digunakan untuk meng-
enkrip private key. Jika parameter ini
diabaikan, maka private key di-enkrip
menggunakan Database Master Key.
SUBJECT =
'certificate_subject_name'
Istilah “subject” mengacu pada informasi
di dalam metadata dari sebuah certificate
yang didefinisikan di dalam standar X.509.
Panjang sebuah subject bisa mencapai
4096 byte. Subject yang melampaui 4096
byte akan dipotong ketika disimpan di da-
lam catalog.
START_DATE =
'yyyy/mm/dd'
Tanggal dimana certificate mulai aktif. Ji-
ka diabaikan, maka START_DATE akan
sama dengan tanggal pembuatannya.
EXPIRY_DATE =
'yyyy/mm/dd'
Tanggal dimana certificate menjadi keda-
luwarsa. Jika parameter ini diabaikan, ma-
ka EXPIRY_DATE adalah satu tahun dari
START_DATE.
Contoh:
CREATE CERTIFICATE MyCert01
WITH Subject='My Subject' 112
Perintah di atas akan membuat sebuah certificate dengan private
key yang di-enkrip menggunakan Database Master Key karena
password enkripsinya tidak ditentukan. Untuk melihat informasi
certificate ini, silakan menjalankan sebuah query terhadap view
sys.certificates seperti di bawah ini.
SELECT [name],pvt_key_encryption_type_desc,
subject,expiry_date, start_date
FROM sys.certificates
Output:
name pvt_key_encryption_type_desc subject expiry_date start_date
--------- ----------------------------- ------------ ----------------------- -----------------------
MyCert01 ENCRYPTED_BY_MASTER_KEY My Subject 2007-06-28 15:04:33.000 2006-06-28 15:04:33.000

(1 row(s) affected)
Contoh lain pembuatan sebuah certificate adalah dengan menen-
tukan tanggal aktif dan kedaluwarsanya.
CREATE CERTIFICATE MyCert02
ENCRYPTION BY PASSWORD = 'MyP4ssw0rd'
WITH SUBJECT = 'Sammamish Shipping Records',
START_DATE = '2006/06/15', EXPIRY_DATE = '2009/10/31'
Hasil eksekusi perintah di atas bisa dilihat pada view sys.certifi-
cates yang sama.
name pvt_key_encryption_type_desc subject expiry_date start_date
--------- ---------------------------- --------------------------- ----------------------- -----------------------
MyCert01 ENCRYPTED_BY_MASTER_KEY My Subject 2007-06-15 00:00:00.000 2006-06-15 00:00:00.000
MyCert02 ENCRYPTED_BY_PASSWORD Sammamish Shipping Records 2009-10-31 00:00:00.000 2006-06-15 00:00:00.000

(2 row(s) affected)
Berkaitan dengan terbatasnya masa aktif sebuah certificate,
mungkin Anda akan mengajukan pertanyaan: apa yang akan ter-
jadi jika sebuah certificate kedaluwarsa? Walaupun tanggal keda-
luwarsa jelas-jelas tertera di dalam metadata, namun saat ini tang-
gal tersebut belum berpengaruh apa-apa. Sebuah certificate yang
sudah kedaluwarsa tetap bisa digunakan untuk meng-enkrip dan
men-dekrip data.
Untuk menghapus sebuah certificate, silakan jalankan perintah
dengan sintaks berikut ini.
DROP CERTIFICATE certificate_name
Contoh penerapan dari pembuatan sebuah certificate diperlihatkan
pada skrip berikut ini. Proses enkripsi sebuah data menggunakan
certificate dilakukan dengan pemanggilan fungsi EncryptByCert. 113
Dua parameter yang diperlukan oleh fungsi ini adalah kode pe-
ngenal dari certificate yang bersangkutan, diperoleh dengan ban-
tuan fungsi Cert_ID, dan plaintext yang akan di-enkrip itu sendiri.
Hasil pemanggilan fungsi EncryptByCert adalah sebuah ciphertext
yang berbentuk data bertipe varbinary. Untuk mendapatkan kem-
bali plaintext dari ciphertext tersebut, fungsi DecryptByCert bisa
digunakan dengan cara mengirimkan kode pengenal dari certifi-
cate tersebut sebagai parameternya, diikuti ciphertext yang ber-
sangkutan dan password yang digunakan untuk membuat certifi-
cate itu.
Sekali lagi, hasil dekripsi ini juga sebuah data bertipe varbinary
sehingga ia harus dikonversi dengan perintah CONVERT(nvarchar,
...) untuk mendapatkan teks aslinya.

/*
CREATE CERTIFICATE MyCert02
ENCRYPTION BY PASSWORD = 'MyP4ssw0rd'
WITH SUBJECT = 'Sammamish Shipping Records',
START_DATE = '2006/06/15', EXPIRY_DATE = '2009/10/31'
*/

DECLARE @ciphertext varbinary(8000),
@plaintext varchar(15),
@decrypted varchar(15)

SELECT @plaintext=NationalIDNumber,
@ciphertext=EncryptByCert(Cert_ID('MyCert02'),
NationalIDNumber )
FROM HumanResources.Employee
WHERE EmployeeID=1

SELECT @plaintext AS 'Plain Text',@ciphertext AS 'Encrypted
Text'

SELECT CONVERT(nvarchar,DecryptByCert(Cert_Id('MyCert02'),
@ciphertext, N'MyP4ssw0rd') ) AS 'Decrypted Text'

Output:
Plain Text Encrypted Text
--------------- ---------------------------------------------------------------
14417807 0x71955E8104BAC3212992ECAC47AEC6A12D36002B3B99DAEC7DDF7E84DD853 ...

(1 row(s) affected)

Decrypted Text
------------------------------
14417807

(1 row(s) affected) 114
Dengan adanya fungsi-fungsi enkripsi dan dekripsi yang dikemas
di dalam SQL Server 2005, para programmer mendapatkan kemu-
dahan untuk menggunakan fasilitas-fasilitas yang telah tersedia
tersebut bersama dengan aplikasi-aplikasi yang dibangunnya. Se-
lain menghemat waktu dan tenaga, masih ditambah lagi dengan
jaminan kehandalan dari algoritma-algoritma itu sendiri.
Hal yang mungkin masih menjadi kekurangan adalah bahwa
fungsi-fungsi itu hanya menerima data berbentuk teks (char,
nchar, varchar, atau nvarchar) untuk di-enkrip, dan tidak mene-
rima tipe data lain seperti int, decimal, dan datetime. Namun ken-
dala ini dapat ditangani dengan mudah. Agar data-data selain teks
dapat di-enkrip, maka sebelum dikirim sebagai input dari fungsi-
fungsi enkripsi, data itu harus dikonversi dahulu menjadi bentuk
teks menggunakan perintah CONVERT. Hal yang sama juga ber-
laku saat ciphertext di-dekrip, dimana plaintext yang dihasilkan
selanjutnya harus dikonversi lagi ke tipe data semula.

Tidak ada komentar: