Go의 사이버 보안

Apr 29 2023
10개의 Golang 스니펫으로 애플리케이션을 보호하세요.
소개 이 기사에서는 보안 시스템을 만드는 데 중요한 Go의 기본 기능에 대해 알아봅니다. 여기에는 암호화, 네트워크 프로그래밍 및 HTTP가 포함됩니다.
Lexica를 사용하여 생성

소개

이 기사에서는 보안 시스템을 만드는 데 중요한 Go의 기본 기능에 대해 알아봅니다. 여기에는 암호화, 네트워크 프로그래밍 및 HTTP가 포함됩니다. 이러한 기능은 보안 클라이언트-서버 앱, 암호화된 파일 시스템 또는 SSL/TLS를 사용하는 웹 앱을 개발하는 경우에 유용합니다. 이러한 기능을 활용하면 프로젝트를 시작하고 시스템의 안정성과 안전성을 보장할 수 있습니다.

crypto/rand.Read

암호학적으로 안전한 난수를 생성하기 위해 이 crypto/rand.Read기능을 활용할 수 있습니다. 입력으로 바이트 슬라이스가 필요하고 오류(있는 경우)와 함께 쓰여진 바이트 수를 제공합니다. 난수를 생성하는 데 사용하는 방법의 예는 다음과 같습니다.

buf := make([]byte, 16)
_, err := rand.Read(buf)
if err != nil {
    panic(err)
}

crypto/sha256.Sum256함수는 바이트 슬라이스의 SHA-256 해시를 계산하는 데 사용됩니다. 이 함수는 바이트 슬라이스를 입력으로 사용하고 SHA-256 해시를 나타내는 32바이트 배열을 반환합니다.

crypto/sha256.Sum256다음은 SHA-256 해시를 계산하는 데 사용하는 방법의 예입니다 .

hash := sha256.Sum256([]byte("Hello, World!"))

crypto/tls.Listen함수는 지정된 주소 및 포트에서 들어오는 TLS 연결을 수신 대기합니다. 이 함수는 네트워크 유형, 주소 및 구조를 입력으로 사용 하고 수신 소켓을 나타내는 인터페이스를 tls.Config반환합니다 .tls.Listener

crypto/tls.Listen다음은 들어오는 TLS 연결을 수신하는 데 사용하는 방법의 예입니다 .

cert, err := tls.LoadX509KeyPair("cert.pem", "key.pem")
if err != nil {
    panic(err)
}

config := &tls.Config{
    Certificates: []tls.Certificate{cert},
}

ln, err := tls.Listen("tcp", ":443", config)
if err != nil {
    panic(err)
}
defer ln.Close()

crypto/x509.ParseCertificate기능은 바이트 슬라이스에서 X.509 인증서를 구문 분석하는 데 사용됩니다. 인증서를 구문 분석하려면 X.509 인증서를 나타내는 바이트 슬라이스를 함수에 입력하면 구문 분석된 인증서를 나타내는 구조가 반환됩니다.

crypto/x509.ParseCertificate다음은 X.509 인증서를 구문 분석하는 데 사용하는 방법의 예입니다 .

certData, err := ioutil.ReadFile("cert.pem")
if err != nil {
    panic(err)
}

cert, err := x509.ParseCertificate(certData)
if err != nil {
    panic(err)
}

패키지 crypto/hmac는 HMAC(해시 기반 메시지 인증 코드) 알고리즘을 구현하기 위한 기능을 제공합니다. 이 패키지는 SHA-1, SHA-256 및 SHA-512를 비롯한 다양한 해시 함수를 사용하여 HMAC를 컴퓨팅하는 기능을 제공합니다.

crypto/hmac다음은 HMAC를 계산하는 데 사용하는 방법의 예입니다 .

key := []byte("secret key")
message := []byte("Hello, World!")

mac := hmac.New(sha256.New, key)
mac.Write(message)
sum := mac.Sum(nil)

이 패키지는 AES, DES 및 Blowfish와 같은 대칭 블록 암호를crypto/cipher 구현하기 위한 기능을 제공합니다 . 이 패키지는 공유 키를 사용하여 데이터를 암호화하고 해독하는 다양한 기능을 제공합니다.

crypto/cipher다음은 AES를 사용하여 데이터를 암호화하고 해독하는 방법의 예입니다 .

key := []byte("secret key")
plaintext := []byte("Hello, World!")

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

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

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

// To decrypt
plaintext2 := make([]byte, len(plaintext))
stream = cipher.NewCFBDecrypter(block, iv)
stream.XORKeyStream(plaintext2, ciphertext[aes.BlockSize:])

패키지 crypto/rsa는 암호화 및 디지털 서명에 일반적으로 사용되는 RSA 알고리즘을 구현하기 위한 기능을 제공합니다. 이 패키지는 RSA 키 생성 , 데이터 암호화 및 해독, 디지털 서명 서명 및 확인을 위한 기능을 제공합니다.

crypto/rsa다음은 RSA를 사용하여 데이터를 암호화하고 해독하는 방법의 예입니다 .

privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
    panic(err)
}

publicKey := &privateKey.PublicKey

plaintext := []byte("Hello, World!")
ciphertext, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, publicKey, plaintext, nil)
if err != nil {
    panic(err)
}

plaintext2, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, privateKey, ciphertext, nil)
if err != nil {
    panic(err)
}

crypto/x509패키지는 SSL/TLS 인증서에 일반적으로 사용되는 X.509 표준을 구현하기 위한 기능을 제공합니다. 이 패키지는 X.509 인증서 구문 분석, X.509 인증서 생성 및 X.509 인증서 확인을 위한 기능을 제공합니다.

crypto/x509다음은 X.509 인증서를 구문 분석하는 데 사용하는 방법의 예입니다 .

certData, err := ioutil.ReadFile("cert.pem")
if err != nil {
    panic(err)
}

cert, err := x509.ParseCertificate(certData)
if err != nil {
    panic(err)
}

crypto/elliptic패키지는 디지털 서명에 일반적으로 사용되는 타원 곡선 암호화를 구현하기 위한 기능을 제공합니다. 이 패키지는 타원 곡선 키의 생성 및 관리는 물론 디지털 서명의 서명 및 검증을 가능하게 하는 다양한 기능을 제공합니다.

다음은 를 사용하여 타원 곡선 키를crypto/elliptic 생성 하고 메시지에 서명하는 방법의 예입니다 .

privateKey, err := elliptic.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
    panic(err)
}

publicKey := privateKey.PublicKey

message := []byte("Hello, World!")
r, s, err := ecdsa.Sign(rand.Reader, privateKey, message)
if err != nil {
    panic(err)
}

valid := ecdsa.Verify(&publicKey, message, r, s)
fmt.Println("Signature valid:", valid)

net/http패키지는 HTTP 서버 및 클라이언트를 구현하기 위한 기능을 제공합니다. 이 패키지는 HTTP 요청 송수신, HTTP 응답 구문 분석 및 HTTP 세션 관리를 위한 기능을 제공합니다.

net/http다음은 HTTP GET 요청을 보내고 응답을 받는 데 사용하는 방법의 예입니다 .

resp, err := http.Get("https://www.example.com")
if err != nil {
    panic(err)
}
defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    panic(err)
}

fmt.Println(string(body))