Implementasi Metode Standard Symmetric Encryption Signature pada Golang
Tags: go
Published: 2024-07-05 03:39:08


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xib7ktvnbrqfcl87y7eg.png)


### Apa Itu Metode Standard Symmetric Encryption Signature?

Jadi, gini, metode ini adalah cara untuk mengenkripsi data biar aman dan nggak bisa dibaca sama orang yang nggak punya kunci dekripsinya. Bayangin aja temen-temen punya diary yang temen-temen kunci pake gembok. Hanya orang yang punya kuncinya yang bisa buka dan baca diary temen-temen.

#### Symmetric Encryption
Symmetric encryption ini kayak temen-temen dan temennya temen-temen eh ini apa si wkwkwk intinya gitu, punya satu kunci yang sama buat buka gembok. Kunci ini dipake buat enkripsi (mengunci) dan dekripsi (membuka) data. Jadi, baik temen-temen maupun temennya temen-temen bisa mengunci dan membuka data yang sama asalkan kalian punya kuncinya.

#### Signature
Signature di sini bukan tanda tangan fisik, tapi lebih ke tanda tangan digital. Tanda tangan ini memastikan bahwa data yang dikirim beneran dari temen-temen dan nggak ada yang mengubah data di tengah jalan. Jadi, temen-temen bisa yakin data yang temen-temen terima asli dari sumbernya dan nggak diutak-atik.

### Kenapa Harus Pakai Metode Ini?

- Keamanan Data: Pastinya temen-temen mau datanya aman dari tangan-tangan jahil, kan? Dengan symmetric encryption, data temen-temen terenkripsi dan cuma bisa dibuka sama orang yang punya kuncinya.
- Integritas Data: Dengan signature, temen-temen bisa pastikan data yang temen-temen terima atau kirim itu asli dan nggak diubah-ubah. Jadi, temen-temen nggak perlu khawatir ada yang curang.
- Efisiensi: Symmetric encryption biasanya lebih cepat dibanding [Asymmetric Encryption](https://yogameleniawan.com/learning-media/mengenal-asymmetric-encryption-keamanan-data-tingkat-tinggi-dengan-golang-4b17) karena proses enkripsi dan dekripsinya lebih sederhana.

### Contoh Penggunaan di Golang
Sekarang kita liat gimana cara pake metode ini di Golang.

#### Symmetric Encryption di Golang

```go
package main

import (
	"crypto/aes"
	"crypto/cipher"
	"crypto/rand"
	"encoding/hex"
	"fmt"
	"io"
)

func encrypt(key, text []byte) (string, error) {
	block, err := aes.NewCipher(key)
	if err != nil {
		return "", err
	}

	ciphertext := make([]byte, aes.BlockSize+len(text))
	iv := ciphertext[:aes.BlockSize]
	if _, err := io.ReadFull(rand.Reader, iv); err != nil {
		return "", err
	}

	stream := cipher.NewCFBEncrypter(block, iv)
	stream.XORKeyStream(ciphertext[aes.BlockSize:], text)

	return fmt.Sprintf("%x", ciphertext), nil
}

func decrypt(key []byte, cryptoText string) (string, error) {
	ciphertext, _ := hex.DecodeString(cryptoText)

	block, err := aes.NewCipher(key)
	if err != nil {
		return "", err
	}

	if len(ciphertext) < aes.BlockSize {
		return "", fmt.Errorf("ciphertext too short")
	}
	iv := ciphertext[:aes.BlockSize]
	ciphertext = ciphertext[aes.BlockSize:]

	stream := cipher.NewCFBDecrypter(block, iv)
	stream.XORKeyStream(ciphertext, ciphertext)

	return string(ciphertext), nil
}

func main() {
	key := []byte("the-key-has-to-be-32-bytes-long!")
	plaintext := "hello, world!"

	ciphertext, err := encrypt(key, []byte(plaintext))
	if err != nil {
		fmt.Println("Error encrypting:", err)
		return
	}
	fmt.Printf("Encrypted: %s\n", ciphertext)

	decryptedText, err := decrypt(key, ciphertext)
	if err != nil {
		fmt.Println("Error decrypting:", err)
		return
	}
	fmt.Printf("Decrypted: %s\n", decryptedText)
}

```

#### Signature Golang

```go
package main

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/hex"
	"fmt"
)

func createHMAC(key, message []byte) string {
	mac := hmac.New(sha256.New, key)
	mac.Write(message)
	return hex.EncodeToString(mac.Sum(nil))
}

func verifyHMAC(key, message []byte, signature string) bool {
	expectedMAC := createHMAC(key, message)
	return hmac.Equal([]byte(expectedMAC), []byte(signature))
}

func main() {
	key := []byte("my-secret-key")
	message := []byte("important message")

	signature := createHMAC(key, message)
	fmt.Printf("Signature: %s\n", signature)

	isValid := verifyHMAC(key, message, signature)
	fmt.Printf("Is valid: %t\n", isValid)
}

```

Jadi Metode Standard Symmetric Encryption Signature ini penting buat ngejaga keamanan dan integritas data temen-temen. Dengan symmetric encryption, temen-temen bisa enkripsi data biar aman, dan dengan signature, temen-temen bisa pastiin data yang temen-temen terima atau kirim itu asli dan nggak diubah-ubah. Jadi, pastikan temen-temen pake metode ini buat segala macam keperluan yang butuh keamanan tinggi.

Sumber: 

- [HMAC Go](https://pkg.go.dev/crypto/hmac)
- [SHA256](https://pkg.go.dev/crypto/sha256)