[go] crypto/rand 패키지를 사용한 안전한 난수 생성과 암호화
안녕하세요! 이번 포스트에서는 Go 언어의 crypto/rand
패키지를 사용하여 안전한 난수를 생성하고, 암호화하는 방법에 대해 알아보겠습니다.
목차
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/cipher
와 crypto/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 언어 문서를 참고하시기 바랍니다.