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.

Enkripsi-deskripsi

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.

Hash tidak bisa dikembalikan ke data semula

🚨 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

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.

MD5

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 πŸ™