LoginSignup
2
0

More than 3 years have passed since last update.

Goでembedパッケージ使って大事なものを埋め込んではいけない

Posted at

TL;DR

  • Go 1.16からファイル内容をバイナリに埋め込むembedパッケージやディレクティブが追加された
  • ただ、パスワードやAPIトークンなどのバレたらまずいデータは埋め込まないこと
    • 実行ファイルにそのまま埋め込まれているので
    • どうしても埋め込みたいなら予めcryptoパッケージでハッシュ化しておいた内容を埋め込むなどする
      • それでもバレるときはバレる
  • これはGoに限った話ではない
  • センシティブな情報は安易に埋め込まない

embedの使い方

以下のコードで embed_data.json の内容を実行バイナリに含むことができる

main.go
package main

import (
    _ "embed"
    "encoding/json"
    "fmt"
)

//go:embed embed_data.json
var embedData []byte

// UserData ユーザーデータ(例:API実行用のユーザー)
type UserData struct {
    Key1 string `json:"user"`
    Key2 string `json:"password"`
}

func main() {
    userData := UserData{}

    err := json.Unmarshal(embedData, &userData)
    if err != nil {
        panic(err)
    }

    // 試しにデータを見る
    fmt.Printf("%v\n", userData)
}
embed_data.json
{
    "user": "hogehoge",
    "password": "fugafuga"
}
実行結果
$ ./embed_test.exe 
{hogehoge fugafuga}

実行ファイルを覗くと・・・?

  • しっかり生データが実行バイナリに埋め込まれている
    • つまりバイナリを覗かれると大事なデータが引っこ抜かれる可能性がある image.png

embedは何に使うべきか?

色々あると思うが、個人的には以下がぱっと思いつくもの

  • テンプレファイル
    • 自動でMarkdownやテキストデータを出したいときの下地を埋め込む
  • デフォルト設定ファイル
    • ユーザーの設定ファイルがないときに使用する設定ファイル
  • 依存データを無くしたいときのデータ埋め込み手段
    • 「とにかくバイナリのみで動かしたい!」というとき
  • etc...

参考文献

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0