[go] crypto/rand 패키지를 사용한 안전한 난수 생성과 암호화

안녕하세요! 이번 포스트에서는 Go 언어의 crypto/rand 패키지를 사용하여 안전한 난수를 생성하고, 암호화하는 방법에 대해 알아보겠습니다.

목차

  1. crypto/rand 패키지란?
  2. 안전한 난수 생성하기
  3. 암호화하기
  4. 마무리

crypto/rand 패키지란?

crypto/rand 패키지는 Go 언어에서 안전한 난수를 생성하고, 암호화하기 위한 라이브러리입니다. 이 패키지는 암호학적으로 안전한 난수를 생성하여 보안적으로 민감한 정보를 다루는 애플리케이션에서 사용됩니다.

안전한 난수 생성하기

난수를 생성하기 위해서는 crypto/rand 패키지에서 제공하는 Read 함수를 사용합니다. 이 함수는 []byte 타입의 슬라이스를 매개변수로 받아 그 안에 난수를 채워줍니다.

예제:

package main

import (
	"crypto/rand"
	"fmt"
)

func main() {
	randomBytes := make([]byte, 16)
	_, err := rand.Read(randomBytes)
	if err != nil {
		fmt.Println("난수 생성에 실패했습니다:", err)
		return
	}
	fmt.Println("안전한 난수:", randomBytes)
}

위 예제에서 rand.Read 함수를 사용하여 16바이트의 안전한 난수를 생성하고 출력합니다.

암호화하기

생성한 난수를 활용하여 데이터를 암호화하기 위해서는 crypto/ciphercrypto/aes 패키지를 함께 사용합니다. 이를 통해 대칭키 암호화를 수행할 수 있습니다.

예제:

package main

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

func main() {
	key := []byte("example key 1234") // 16, 24, 32 bytes 중에 선택
	plaintext := []byte("암호화할 데이터")

	block, err := aes.NewCipher(key)
	if err != nil {
		fmt.Println("암호화 키 생성에 실패했습니다:", err)
		return
	}

	ciphertext := make([]byte, aes.BlockSize+len(plaintext))
	iv := ciphertext[:aes.BlockSize]
	_, err = io.ReadFull(rand.Reader, iv)
	if err != nil {
		fmt.Println("IV 생성에 실패했습니다:", err)
		return
	}

	mode := cipher.NewCBCEncrypter(block, iv)
	mode.CryptBlocks(ciphertext[aes.BlockSize:], plaintext)

	fmt.Printf("암호화된 데이터: %x\n", ciphertext)
}

위 예제에서는 crypto/aes 패키지를 사용하여 데이터를 암호화한 후, 암호문을 출력합니다.

마무리

이번 포스트에서는 Go 언어의 crypto/rand 패키지를 사용하여 안전한 난수를 생성하고, 데이터를 암호화하는 방법에 대해 살펴보았습니다. 보안적으로 중요한 정보를 다루는 애플리케이션을 개발할 때, 이러한 라이브러리를 활용하여 안전한 데이터 처리를 할 수 있습니다.

더 많은 정보는 공식 Go 언어 문서를 참고하시기 바랍니다.