Hashing adalah suatu proses untuk merubah sebuah Data (umumnya dari string) menjadi bentuk lain yang biasanya lebih ringkas/pendek. Bisa dikatakan juga Hashing adalah proses mengubah Data menjadi Hash menggunakan HashFunction.
Perlu diingat beda dengan encrypt/decrypt, kita tidak bisa mendapatkan kembali Data dengan hanya mengetahui Hash nya saja.
![](/img/encrypt-decrypt.png#center)
Jika kita meng-encrypt sebuah Data maka kita bisa mengembalikan Data yang sudah kita encrypt tadi asal kita tau cara decrypt (dekripsi) nya dan juga Key yang harus kita gunakan. Tapi kalau hashing itu satu arah, kalau sudah di hash; tidak bisa dikembalikan ke Data asal nya lagi.
![](/img/hashing.png#center)
π¨ Meski dibilang satu arah, tapi tetap saja ada “akal-akalan"nya untuk mengetahui key-nya dengan cara brute force.
Contoh
Contoh function Encryption/Decryption
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"encoding/hex"
"fmt"
"io"
)
func main() {
bytes := []byte("1234567890abcdefghijklmnopABCDEF")
key := hex.EncodeToString(bytes) //encode key in bytes to string and keep as secret, put in a vault
fmt.Printf("key to encrypt/decrypt : %s\n", key)
encrypted := encrypt("sayasukamakan", key)
fmt.Printf("encrypted : %s\n", encrypted)
decrypted := decrypt(encrypted, key)
fmt.Printf("decrypted : %s\n", decrypted)
}
func encrypt(stringToEncrypt string, keyString string) (encryptedString string) {
//Since the key is in string, we need to convert decode it to bytes
key, _ := hex.DecodeString(keyString)
plaintext := []byte(stringToEncrypt)
//Create a new Cipher Block from the key
block, err := aes.NewCipher(key)
if err != nil {
panic(err.Error())
}
//Create a new GCM - https://en.wikipedia.org/wiki/Galois/Counter_Mode
//https://golang.org/pkg/crypto/cipher/#NewGCM
aesGCM, err := cipher.NewGCM(block)
if err != nil {
panic(err.Error())
}
//Create a nonce. Nonce should be from GCM
nonce := make([]byte, aesGCM.NonceSize())
if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
panic(err.Error())
}
//Encrypt the data using aesGCM.Seal
//Since we don't want to save the nonce somewhere else in this case, we add it as a prefix to the encrypted data. The first nonce argument in Seal is the prefix.
ciphertext := aesGCM.Seal(nonce, nonce, plaintext, nil)
return fmt.Sprintf("%x", ciphertext)
}
func decrypt(encryptedString string, keyString string) (decryptedString string) {
key, _ := hex.DecodeString(keyString)
enc, _ := hex.DecodeString(encryptedString)
//Create a new Cipher Block from the key
block, err := aes.NewCipher(key)
if err != nil {
panic(err.Error())
}
//Create a new GCM
aesGCM, err := cipher.NewGCM(block)
if err != nil {
panic(err.Error())
}
//Get the nonce size
nonceSize := aesGCM.NonceSize()
//Extract the nonce from the encrypted data
nonce, ciphertext := enc[:nonceSize], enc[nonceSize:]
//Decrypt the data
plaintext, err := aesGCM.Open(nil, nonce, ciphertext, nil)
if err != nil {
panic(err.Error())
}
return fmt.Sprintf("%s", plaintext)
}
Source code: sumber
![](/img/encrypt-result-go.png#center)
Salah satu contoh function decryption dan encryption adalah AES. Kita bisa coba melakukan AES dengan menggunakan source code diatas yang kita run di play.golang.org. Kode diatas men-generate 32byte random key, kemudian melakukan enkripsi string sayasukamakan
menggunakan AES dengan key 1234567890abcdefghijklmnopABCDEF
. Hasil enkripsinya adalah string dibawah ini:
b790fe783e702e598a44abeb76528611ed01a6719db1317ca683c92a0ab117403f8d84dcee200ff7de
Apabila kita berikan data yang ter-enkripsi diatas ini kepada orang lain. Maka orang itu tidak akan bisa menebak kata asalnya (sayasukamakan) jika tidak mengetahui algoritma enkripsi dan key yang digunakan. Kecuali dia punya sangat banyak waktu atau komputer yang canggih buat coba semua kemungkinan fungsi enkripsi dan kombinasi key π
Contoh function Hashing
Contoh function hashing antara lain
- MD5
- Secure Hash Algortihm (SHA) dengan berbagai versi (SHA-1, SHA-256, SHA-512, dst)
Contohnya saat kita melakukan MD5 dengan Key sayasukamakan
hasil Hash nya adalah a577a16e18df6996304e71e9f0f7deb2
. Kita bisa coba di https://www.md5.cz/.
π¨ Meski kita makai website md5.cz disini, tapi tidak dianjurkan untuk melakukan hashing melalui website karena website tersebut bisa saja mengumpulkan data hashing yang dilakukan user dibalik layar.
![](/img/sayasukamakan-md5.png#center)
Meski guna dari algoritma hash (md5) ini adalah untuk mengacak data, namun jika Key nya masih sama maka hasil Hash-nya juga akan sama kapan pun kita melakukan hashing. Umumnya algoritma hash yang baik harus bisa memberikan hasil yang unik untuk jumlah varian Key yang banyak. Jika sebuah algoritma hash memberikan hasih Hash yang sama untuk Key yang berbeda, kejadian ini disebut Hash Collision atau Tabrakan Hash π
Sekian tentang Hashing dan Encrypt/Decrypt, semoga membantu π