◆ encoding / json 패키지 이용
▶ func Marshal(v interface!}) ([]byte, error): Go 언어 자료형을 JSON 텍스트로 변환
▶ func Marshallndent(v interfaced, prefix, indent string) ([]byte, error): Go 언어 자료형을 JSON 텍스트로 변환하고 사람이 보기 편하도록 들여쓰기를 해줌
▶ func Unmarshal(data []byte, v interface^) error: JSON 텍스트를 Go 언어 자료형으로 변환
● json 읽기
package main
import (
"encoding/json"
"fmt"
)
func main() {
doc := `
{
"name": "joylucky",
"age": 35
}
`
var data map[string]interface{} // JSON 문서의 데이터를 저장할 공간을 맵으로 선언
json.Unmarshal([]byte(doc), &data) // doc를 바이트 슬라이스로 변환하여 넣고,
// data의 포인터를 넣어줌
fmt.Println(data["name"], data["age"]) // maria 10: 맵에 키를 지정하여 값을 가져옴
}
● json 변환
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := make(map[string]interface{}) // 문자열을 키로하고 모든 자료형을 저장할 수 있는 맵 생성
data["name"] = "joylucky"
data["age"] = 35
doc, _ := json.Marshal(data) // 맵을 JSON 문서로 변환
fmt.Println(string(doc)) // {"age":35,"name":"joylucky"}: 문자열로 변환하여 출력
}
● 구조체 활용
package main
import (
"encoding/json"
"fmt"
)
type Author struct {
Name string
Email string
}
type Comment struct {
Id uint64
Author Author // Author 구조체
Content string
}
type Article struct {
Id uint64
Title string
Author Author // Author 구조체
Content string
Recommends []string // 문자열 배열
Comments []Comment // Comment 구조체 배열
}
func main() {
doc := `
[{
"Id": 1,
"Title": "Hello, world!",
"Author": {
"Name": "Maria",
"Email": "maria@example.com"
},
"Content": "Hello~",
"Recommends": [
"John",
"Andrew"
],
"Comments": [{
"id": 1,
"Author": {
"Name": "Andrew",
"Email": "andrew@hello.com"
},
"Content": "Hello Maria"
}]
}]
`
var data []Article // JSON 문서의 데이터를 저장할 구조체 슬라이스 선언
json.Unmarshal([]byte(doc), &data) // doc의 내용을 변환하여 data에 저장
fmt.Println(data) // [{1 Hello, world! {Maria maria@exa... (생략)
}
◆ 암호화 알고리즘
▶ 해시(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 (dO *digest) Sum(in []byte) []byte: 해시 인스턴스에 저장된 데이터의 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)
}
다음시간에는 AES 대칭키 알고리즘 그리고 RSA 공개키 알고리즘에 대해서 알아보는 시간을 가져보자
https://joylucky7.tistory.com/45
'IT 초보코딩의 세계 > Go 언어' 카테고리의 다른 글
[Block Chain] Go언어의 Web Download 3장 (0) | 2023.04.14 |
---|---|
[Block Chain] Go언어의 AES 대칭키, RSA 공개키 알고리즘 2장 (2) | 2023.04.14 |
Go언어의 출력함수 IO, 파일 입출력, ioutil패키지 3장 (2) | 2023.04.12 |
Go언어의 출력함수 IO, 문자열 처리 및 조작, 정규식 2장 (7) | 2023.04.11 |
Go언어의 출력함수 IO, FMT, 유니코드, 디코딩 1장 (6) | 2023.04.10 |
댓글