가장 빨리 만나는 Go 언어 Unit 53. 암호화 사용하기

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

암호화 사용하기

이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07

Go 언어에서는 해시, 대칭키 알고리즘, 공개키 알고리즘을 비롯해 다양한 암호화 알고리즘을 패키지로 제공합니다. 보통 암호화 알고리즘은 파일을 암호화하거나, 네트워크로 데이터를 주고 받을 때 데이터를 보호하기 위해 사용합니다.

  • 해시(Hash) 알고리즘: MD5, SHA1, SHA256, SHA512 등이 있으며 데이터에서 고유한 해시 값을 추출해냅니다. 이 해시 값으로 데이터를 만들어낼 수는 없습니다. 단방향 암호화 알고리즘이라고도 하며 패스워드를 저장할 때 사용합니다.
  • 대칭키 알고리즘(Symmetric-key algorithm): AES, DES, RC4 등이 있으며 암호화하는 키와 복호화하는 키가 동일합니다.
  • 공개키 알고리즘(Public key infrastructure, PKI): RSA가 대표적이며 암호화하는 키와 복호화하는 키가 다릅니다. 암호화하는 키는 공개 키라고 하여 외부에 공개하고, 복호화하는 키는 비밀 키(개인 키)라고하여 외부에 노출하지 않습니다. 공개 키로는 비밀 키를 만들어내기 힘들도록 설계되어 있습니다.

해시 알고리즘 사용하기

다음은 crypto/sha512 패키지에서 제공하는 해시 알고리즘 함수입니다.

  • func New() hash.Hash: SHA512 해시 인스턴스 생성
  • func Sum512(data []byte) [Size]byte: SHA512 해시를 계산하여 리턴
  • func (d *digest) Write(p []byte) (nn int, err error): 해시 인스턴스에 데이터 추가
  • func (d0 *digest) Sum(in []byte) []byte: 해시 인스턴스에 저장된 데이터의 SHA512 해시 값 추출

SHA512 알고리즘을 사용하여 데이터에서 해시 값을 추출해보겠습니다.

package main

import (
	"crypto/sha512"
	"fmt"
)

func main() {
	s := "Hello, world!"
	h1 := sha512.Sum512([]byte(s)) // 문자열의 SHA512 해시 값 추출
	fmt.Printf("%x\n", h1)

	sha := sha512.New()          // SHA512 해시 인스턴스 생성
	sha.Write([]byte("Hello, ")) // 해시 인스턴스에 데이터 추가
	sha.Write([]byte("world!"))  // 해시 인스턴스에 데이터 추가
	h2 := sha.Sum(nil)           // 해시 인스턴스에 저장된 데이터의 SHA512 해시 값 추출
	fmt.Printf("%x\n", h2)
}
실행 결과
c1527cd893c124773d811911970c8fe6e857d6df5dc9226bd8a160614c0cd963a4ddea2b94bb7d36021ef9d865d5cea294a82dd49a0bb269f51f6e7a57f79421
c1527cd893c124773d811911970c8fe6e857d6df5dc9226bd8a160614c0cd963a4ddea2b94bb7d36021ef9d865d5cea294a82dd49a0bb269f51f6e7a57f79421

SHA512 해시 값을 추출하는 방법은 간단합니다. sha512.Sum512 함수에 []byte 형식으로 데이터를 넣어주면 해시 값이 리턴됩니다.

sha512.New 함수를 사용하여 새로운 인스턴스를 생성하였다면 Write 함수로 데이터를 넣은 뒤 Sum 함수로 해시 값을 만들면 됩니다. 이때 Sum 함수에는 nil을 넣어줍니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

2015-06-01