Sabtu, 06 Oktober 2012

Tanda Tangan Digital

Perkembangan teknologi kerap kali menyuguhkan  kosakata baru yang terasa asing bagi kita. Mungkin karena memang kita belum pernah mendengarnya sama sekali, atau sebenarnya kita mengetahuinya namun merasa tidak tahu karena biasa disajikan dalam bahasa asing atau bahasa serapan. Kosa kata yang kerap kita temui antara lain cybercrime, digital signature, social engineering, hacker, dan cracker. Kali ini saya akan mencoba membahas mengenai digital signature. Apa sih sebenarnya yang dimaksud dengan digital signature?

Jika ditinjau dari segi bahasanya, digital signature pastilah merupakan sebuah frasa yang berasal dari bahasa Inggris. Jika diterjemahkan secara kata perkata, didapatlah istilah “tanda tangan digital”. Apakah itu berarti sebuah scan tanda tangan kita sehingga memiliki format JPG atau PNG dan kemudian bisa dicopy ke dokumen-dokumen kita? Ternyata bukan. Yang seperti itu dinamakan digitalized signature (tandatangan yang terdigitalisasi) . Lalu apa sih yang dimaksud dengan digital signature ini?



"A digital signature or digital signature scheme is a mathematical scheme for demonstrating the authenticity of a digital message or document. A valid digital signature gives a recipient reason to believe that the message was created by a known sender, and that it was not altered in transit. Digital signatures are commonly used for software distribution, financial transactions, and in other cases where it is important to detect forgery or tampering."

Dalam bahasa Indonesianya kira-kira maksudnya seperti ini:

Tanda Tangan Digital atau Skema tanda tangan digital adalah sebuah skema matematis untuk mengautorisasi kepemilikan dari sebuah pesan atau dokumen digital. Sebuah tanda tangan digital yang valid memberikan alasan bagi penerima untuk mempercayai bahwa pesan yang dikirim benar-benar dibuat oleh pengirim yang diketahui, dan tidak dimanipulasi dalam perjalanan. Tanda tangan digital biasanya digunakan dalam distribusi software, transaksi keuangan, dan dalam kasus-kasus lain dimana sangat penting dilakukan deteksi terhadap pemalsuan.

Penjelasan lebih sederhananya, dalam perjalanan tranfer dokumen di dunia maya, sangat riskan terjadi penyadapan dan manipulasi dokumen yang kita kirimkan. Misalnya saja penguban, penambahan, atau pengurangan data. Disitulah fungsi tanda tangan digital bagi penerima, untuk mengecek apakah dokumen yang kita kirim itu benar-benar dari kita tanpa mengalami penyadapan di tengah jalan.
Jadi tujuan dari penggunaan tanda tangan digital ini adalah untuk membuktikan keaslian identitas pengirim dari suatu pesan atau penandatangan dari suatu dokumen, dan untuk memastikan isi yang asli dari pesan atau dokumen itu sudah dikirim tanpa perubahan. Tanda tangan digital dengan mudah dapat dipindahkan, tidak bisa ditiru oleh orang lain, dan dapat secara otomatis dilakukan time-stamp.

Kronologi Digital Signature

Suatu tanda tangan digital dapat digunakan di segala macam pesan, apakah itu terenkripsi atau tidak, sehingga penerima dapat memastikan identitas pengirim itu dan pesan tiba secara utuh. Suatu sertifikat digital berisi tanda tangan digital dari sertifikat yang mengeluarkan otoritas sehingga siapapun dapat memverifikasi bahwa sertifikat itu adalah nyata.
Dalam digital signature, suatu data atau pesan akan dienkripsi dengan menggunakan kunci simetris yang diciptakan secara acak. Kunci ini kemudian akan dienkripsi dengan menggunakan kunci publik dari calon penerima pesan. Hasil dari enkripsi ini kemudian disebut sebagai “digital envelope” yang kemudian akan dikirimkan bersama pesan atau data yang telah dienkripsi. Setelah menerima digital envelope penerima kemudian akan membuka/mendekripsi dengan menggunakkan kunci kunci prifatnya. Hasil yang ia dapatkan dari dekripsi tersebut adalah sebuah kunci simetris yang dapat digunakannya untuk membuka data/pesan tersebut.

Maksud dari menandatangani secara digital adalah untuk tujuan pemberian ciri khas terhadap suatu pesan. Message digest adalah suatu besaran yang berasal dari suatu data/pesan yang memiliki sifat yang unik yang menandai bahwa pesan tersebut mempunyai suatu besaran tertentu. Messages digest diciptakan dengan melakukan enkripsi terhadap suatu data dengan menggunakan menggunakan kriptografi satu arah, yaitu suatu tehnik kriptografi yang terhadapnya tidak dapat dilakukan proses pembalikan (reversed). Pada saat message digests dienkripsi dengan menggunakan kunci privat dari pengirim dan “ditambahkan” kepada data/pesan yang asli maka hasil yang didapat adalah digital signature dari pesan tersebut.

Penerima dari digital signature akan dapat mempercayai bahwa data atau pesan benar-benar berasal pengirim. Dan karena apabila terdapat perubahan suatu data, hal tersebut  akan menyebabkan perubahan message digests dengan suatu cara yang tidak dapat diprediksi. Jika tidak terjadi perubahan, maka penerima akan merasa yakin bahwa data atau pesan tersebut tidak pernah diubah setelah message digest diciptakan.

Sebelum kedua belah pihak baik engirim atau penerima hendak melakukan komunikasi dengan menggunakan kriptografi kunci publik, masing-masing pihak harus merasa yakin akan keberaan mereka. Mereka kemudian melakukan otentifikasi terhadap keberadaan masing-masing pihak. Agar dapat melakukan otentifikasi terhadap keberadaan mereka masing-masing, maka biasanya ditunjuklah pihak ketiga yang akan memberikan otentifikasi terhadap kunci publik mereka. Pihak ketiga ini kita kenal sebagai Certification Authorithy. Certification authorithy ini kemudian akan memberikan suatu sertifikat yang berisi identitas dari pengguna, sertifikat ini ditandatangani secara digital oleh Certification authority tersebut. Isi dari sertifikat tersebut selain identitas ia juga berisi kunci publik dari pemiliknya.

Adapun komponen-komponen dari suatu tanda tangan digitalterdiri atas:
  1. Kunci publik, yakni bagian di mana semua orang dapat mendapat suatu salinan dan menjadi bagian dari sistim verifikasi.
  2. Nama dan alamat e-mail: komponen ini merupakan komponen yang penting untuk tujuan kontak informasi dan memungkinkan pembaca untuk mengidentifikasi detailnya.
  3. Tanggal jatuh tempo kunci publik: Komponen ini digunakan untuk menetapkan suatu umur simpan dan untuk memastikan bahwa dalam hal penyalahgunaan yang diperpanjang suatu tandatangan pada akhirnya tandatangan itu diatur ulang.
  4. Nama dari perusahaan: Komponen ini mengidentifikasi perusahaan yang tandatangan menjadi anggota juga.
  5. Nomor urut dari Digital ID: Part ini adalah suatu nomor yang unik yang digabung pada tandatangan untuk pertimbangan identifikasi iklan perkerjaan mengikuti jalan tambahan.
  6. Tanda tangan digital dari CA (Sertifikasi Authority): Komponen ini merupakan suatu tandatangan yang dikeluarkan oleh otoritas yang mengeluarkan sertifikat.

Implementasi:
Data Encryption Standard
(DES) merupakan salah satu jenis sistem kriptografi simetris yang paling banyak digunakan di dunia dan telah diadopsi oleh NIST (National Institute of Standards and Technology) sebagai standar pengolahan informasi Federal AS. Sedangkan Algoritma ElGamal merupakan salah satu algoritma kriptografi kunci publik (asimetris) yang ditemukan oleh seorang ilmuwan Mesir Taher ElGamal pada tahun 1985. Kekuatan dari algoritma ElGamal ini terletak pada sulitnya menghitung logaritma diskrit.
enkripsi data
Kedua algoritma (DES dan ElGamal) tersebut mempunyai kelemahan dan kelebihannya masing-masing. Itulah sebabnya, mengapa selama 20 tahun algoritma DES dipakai sebagai standar nasional enkripsi data dan masih digunakan sampai saat ini walaupun telah ditemukan algoritma sejenis yang dianggap lebih baik. Sedangkan algoritma ElGamal adalah salah satu dari algoritma kriptografi kunci-publik yang dapat menjadi alternatif karena beberapa dari algoritma tersebut memp unyai kontribusi yang luar biasa dibandingkan dengan sistem kriptografi simetris. Kontribusi yang paling penting adalah tanda-tangan digital (Digital Signature) pada pesan untuk memberikan aspek keamanan otentikasi, integritas data, dan nirpenyangkalan. Digital Signature Standard yang diadopsi pemerintah Amerika Serikat pada tahun 1994, merupakan sebuah mekanisme penyandian yang berdasar pada algoritma ElGamal.

 KESIMPULAN DAN CODE:

--> Tanda tangan digital adalah satu tandatangan elektronik yang dapat digunakan untuk membuktikan keaslian identitas pengirim dari suatu pesan atau penandatangan dari suatu dokumen, dan untuk memastikan isi yang asli dari pesan atau dokumen itu sudah dikirim tanpa perubahan.
Tanda tangan digital dengan mudah dapat dipindahkan, tidak bisa ditiru oleh orang lain, dan dapat secara otomatis dilakukan time-stamp. Kemampuan itu untuk memastikan bahwa pesan asli yang tiba di pengirim tidak bisa dengan mudah diganti. Suatu tanda tangan digital dapat digunakan di segala macam pesan, apakah itu terenkripsi atau tidak, sehingga penerima dapat memastikan identitas pengirim itu dan pesan tiba secara utuh. Suatu sertifikat digital berisi tanda tangan digital dari sertifikat yang mengeluarkan otoritas sehingga siapapun dapat memverifikasi bahwa sertifikat itu adalah nyata.
Apakah Digital Id? Tandatangan id Digital atau sertifikat adalah satu file yang diinstall di suatu komputer untuk mengesahkan siapa Anda. Tanda tangan digital digunakan oleh program-program di internet dan lokal kepada mesin-mesin itu untuk mengkonfirmasikan identitas klien kepada setiap pihak ketiga terkait. Tanda tangan digital berbeda dengan tandatangan yang elektronik. Tandatangan elektronik di-scan dari suatu tandatangan yang tertulis secara fisik. Komponen-komponen dari suatu tanda tangan digital terdiri atas.
1. Kunci publik: Ini adalah bagian di mana semua orang dapat mendapat suatu salinan dan menjadi bagian dari sistim verifikasi.
2. Nama dan alamat e-mail: Ini penting untuk tujuan kontak informasi dan memungkinkan pembaca untuk mengidentifikasi detailnya.
3. Tanggal jatuh tempo kunci publik: Bagian ini digunakan untuk menetapkan suatu umur simpan dan untuk memastikan bahwa dalam hal penyalahgunaan yang diperpanjang suatu tandatangan pada akhirnya tandatangan itu diatur ulang.
4. Nama dari perusahaan: Bagian ini mengidentifikasi perusahaan yang tandatangan menjadi anggota juga.
5. Nomor urut dari Digital ID: Part ini adalah suatu nomor yang unik yang digabung pada tandatangan untuk pertimbangan identifikasi iklan perkerjaan mengikuti jalan tambahan.
6. Tanda tangan digital dari CA (Sertifikasi Authority): Ini adalah suatu tandatangan yang dikeluarkan oleh otoritas yang mengeluarkan sertifikat. Bedasarkan sejarahnya, penggunaan digital signature berawal dari penggunaan teknik kriptografi yang digunakan untuk mengamankan informasi yang hendak ditransmisikan/disampaikan kepada orang yang lain yang sudah digunakan sejak ratusan tahun yang lalu.
 Dalam suatu kriptografi suatu pesan dienkripsi (encrypt) dengan menggunakan suatu kunci (key). Hasil dari enkripsi ini adalah berupa chipertext tersebut kemudian ditransmisikan/diserahkan kepada tujuan yang dikehendakinya. Chipertext tersebut kemudian dibuka/didekripsi (decrypt) dengan suatu kunci untuk mendapatkan informasi yang telah enkripsi tersebut. Terdapat dua macam cara dalam melakukan enkripsi yaitu dengan menggunakan kriptografi simetris (symetric crypthography/secret key crypthography) dan kriptografi simetris (asymetric crypthography) yang kemudian lebih dikenal sebagai public key crypthography. Secret key crypthografi atau yang dikenal sebagai kriptografi simetris, menggunakan kunci yang sama dalam melakukan enkripsi dan dekripsi terhadap suatu pesan (message), disini pengirim dan penerima menggunakan kunci yang sama sehingga mereka harus menjaga kerahasian (secret) terhadap kuci tersebut.
Salah satu algoritma yang terkenal dalam kriptografi simetris ini adalah Data Encryption standard (DES). manjar Public key crypthography, atau dikenal juga sebagai kriptografi simetris, menggunakan dua kunci (key) : satu kunci digunakan untuk melakukan enkripsi terhadap suatu pesan (messages) dan kunci yang lain digunakan untuk melakukan dekripsi terhadap pesan tersebut.
Kedua kunci tersebut mempunyai hubungan secara matematis sehingga suatu pesan yang dienkripsi dengan suatu kunci hanya dapat didekripsi dengan kunci pasangannya. Seorang pengguna mempunyai dua buah kunci, yaitu sebuah kunci privat (privat key) dan juga sebuah kunci publik (public key). Pengguna (user) tersebut kemudian mendistribusikan/menyebarluaskan kunci publik miliknya. Karena terdapat hubungan antara kedua kunsi tersebut, pengguna dan seseorang yang menerima kunci publik akan merasa yakin bahwa suatu data yang diterimanya dan telah berhasil didekripsi hanya dapat berasal dari pengguna yang mempunyai kunci privat. Kepastian /keyakinan ini hanya ada selama kunci privat ini tidak diketahui oleh orang lain. Kedua kunci ini berasal atau diciptakan sendiri oleh penggunanya.
Salah satu algoritma yang terbaik yang dikenal selama ini adalah RSA (dinamakan sesuai dengan nama penciptanya Rivest, Shamir, Adleman). manjarGambar 2 : kriptografi dengan menggunakan kunci publik Pada saat dua orang hendak saling berkomunikasi atau saling bertukar data/pesan secara aman, mereka kemudian saling mengirimkan salah satu kunci yang dipunyainya, yaitu kunci publiknya. Sedangkan mereka menyimpan kunci prifat sebagai pasangan dari kunci publik yang didistribusikannya. Karena data/pesan ini hanya dapat dienkripsi dan dekripsi dengan menggunakan kunci pasangannya maka data ini dapat dapat ditransmisikan dengan aman melalui jaringan yang relatif tidak aman (melalui internet).
Contoh dari penggunaan kriptografi ini adalah jika Bob hendak mentransmisikan suatu data/pesan rahasian kepada Alice maka ia akan melakuakn enkripsi data tersebut dengan menggunakan kunci publik Alice. Selama Alice yakin bahwa tidak ada seorang pun yang mengetahui kunci prifatnya, maka mereka dapat merasa yakin bahwa yang dapat membaca pesan tersebut hanyalah Alice. Contoh dari penggunaan digital signature adalah sebagai berikut, Alice akan membuat message digest dari data/pesan yang hendak ia kirimkan. Kemudian messages digest tersebut dienkripsi dengan menggunakan kunci privat yang ia punyai, hasil yang didapat adalah digital signature dari adata tersebut. Ia kemudian mentransmisikan data dan digital signature itu kepada Bob. Bob pada saat menerima pesan itu akan melihat messages digest dari pesan dan kemudian ia akan membandingkan hasilnya dengan hasil dari digital signature. Apabila hasil yang didapat dari keduannya dalah sama maka Bob akan merasa yakin bahwa pesan yang telah ditandatangani oleh Alice dengan menggunakan kunci privatnya adalah tidak pernah berubah sejak dibuat.

Contoh penerapan tanda tangan digital dalam kode :

import java.io.IOException;
import java.security.InvalidKeyException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Cryptography {
            private static final String CRYPTOGRAPHY_ALGO_DES = "DES";

            private static Cipher cipher = null;
            private static DESKeySpec keySpec = null;
            private static SecretKeyFactory keyFactory = null;

            public static String encrypt(String inputString, String commonKey)
                                    throws InvalidKeyException, IllegalBlockSizeException,
                                    BadPaddingException {

                        String encryptedValue = "";
                        SecretKey key = getSecretKey(commonKey);
                        cipher.init(Cipher.ENCRYPT_MODE, key);
                        byte[] inputBytes = inputString.getBytes();
                        byte[] outputBytes = cipher.doFinal(inputBytes);
                        encryptedValue = new BASE64Encoder().encode(outputBytes);
                        return encryptedValue;
            }

            public static String decrypt(String encryptedString, String commonKey)
                                    throws InvalidKeyException, IllegalBlockSizeException,
                                    BadPaddingException, IOException {
                        String decryptedValue = "";
                        encryptedString = encryptedString.replace(' ', '+');
                        SecretKey key = getSecretKey(commonKey);
                        cipher.init(Cipher.DECRYPT_MODE, key);
                        byte[] recoveredBytes = cipher.doFinal(new BASE64Decoder()
                                                .decodeBuffer(encryptedString));
                        decryptedValue = new String(recoveredBytes);
                        return decryptedValue;
            }

            private static SecretKey getSecretKey(String secretPassword) {
                        SecretKey key = null;
                        try {
                                    cipher = Cipher.getInstance(CRYPTOGRAPHY_ALGO_DES);
                                    keySpec = new DESKeySpec(secretPassword.getBytes("UTF8"));
                                    keyFactory = SecretKeyFactory.getInstance(CRYPTOGRAPHY_ALGO_DES);
                                    key = keyFactory.generateSecret(keySpec);
                        } catch (Exception e) {
                                    e.printStackTrace();
                                    System.out.println("Error in generating the secret Key");
                        }
                        return key;
            }
}
//--------------------class utama
public class TestCrypto {
            public static final String DES_ENCRYPTION_KEY = "testString";
            public static void main(String[] args) {
                        try{
                        String input  = "The quick brown fox jumps over the lazy dog.";
                        String encrypted = Cryptography.encrypt(input, DES_ENCRYPTION_KEY);
                        System.out.println(encrypted);
                        String decrypted = Cryptography.decrypt(encrypted, DES_ENCRYPTION_KEY);
                        System.out.println(decrypted);
                        }catch(Exception e){
                                   
                        }
            }
}
atau refresni lain:


import java.io.IOException;
import java.security.InvalidKeyException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * @author dharmvir.singh
 * The class demonstrates the DES algorithm by using java
 * crypto API
 */
public class Cryptography {
 private static final String CRYPTOGRAPHY_ALGO_DES = "DES";
 private static Cipher cipher = null;
 private static DESKeySpec keySpec = null;
 private static SecretKeyFactory keyFactory = null;

 public static String encrypt(String inputString, String commonKey)
   throws InvalidKeyException, IllegalBlockSizeException,
   BadPaddingException {
  String encryptedValue = null;
  SecretKey key = getSecretKey(commonKey);
  cipher.init(Cipher.ENCRYPT_MODE, key);
  byte[] inputBytes = inputString.getBytes();
  byte[] outputBytes = cipher.doFinal(inputBytes);
  encryptedValue = new BASE64Encoder().encode(outputBytes);
  return encryptedValue;
 }
 public static String decrypt(String encryptedString, String commonKey)
   throws InvalidKeyException, IllegalBlockSizeException,
   BadPaddingException, IOException {
  String decryptedValue = "";
// When Base64Encoded strings are passed in URLs, '+' character gets converted to space and so we need to reconvert the space to '+' and since encoded string cannot have space in it so we are completely safe.
  encryptedString = encryptedString.replace(' ', '+');
  SecretKey key = getSecretKey(commonKey);
  cipher.init(Cipher.DECRYPT_MODE, key);
  byte[] recoveredBytes = cipher.doFinal(new BASE64Decoder()
    .decodeBuffer(encryptedString));
  decryptedValue = new String(recoveredBytes);
  return decryptedValue;
 }
 private static SecretKey getSecretKey(String secretPassword) {
  SecretKey key = null;
  try {
   cipher = Cipher.getInstance(CRYPTOGRAPHY_ALGO_DES);
   keySpec = new DESKeySpec(secretPassword.getBytes("UTF8"));
   keyFactory = SecretKeyFactory.getInstance(CRYPTOGRAPHY_ALGO_DES);
   key = keyFactory.generateSecret(keySpec);
  } catch (Exception e) {
   e.printStackTrace();
   System.out.println("Error in generating the secret Key");
  }
  return key;
 }
}










    Tidak ada komentar:

    Posting Komentar