본문 바로가기
IT 초보코딩의 세계/Go 언어

[Block Chain] Go언어의 JSON, 암호화 1장

by 조이럭키7 2023. 4. 14.
반응형

◆ 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

 

[Block Chain] Go언어의 AES 대칭키, RSA 공개키 알고리즘 2장

앞서서(1장에서) 암호화에 대해서 기본 개념을 살펴보았는데 참고하지 못했다면 아래포스팅을 꼭 읽고 2장을 보도록 하자 https://joylucky7.tistory.com/44 Go언어의 JSON, 암호화 1장 ◆ encoding / json 패키

joylucky7.tistory.com

 

반응형

댓글