Go言語で機密情報の取り扱いをする方法を説明する。
氏名、住所、クレジットカード番号などの個人情報や、顧客情報や仕入先リストなどの機密データの取り扱いは注意が必要になる。
不適切なログ出力によって、これらの情報が不要な箇所で露呈してしまわないようにする必要がある。
実装方法
Goのfmt
パッケージに含まれるStringer
とGoStringer
という二つのインターフェースを実装することで、クレジットカード番号などの機密情報の出力フォーマットをカスタマイズできる。
Stringerインターフェース
type Stringer interface {
String() string
}
GoStringerインターフェース
type GoStringer interface {
GoString() string
}
使用サンプル
これらのインターフェースを使用して拡張することにより、クレジットカード番号などの機密情報を含むフィールドのログ出力を、ダミー値に置き換えることができる。
package main
import (
"encoding/json"
"fmt"
)
// 機密情報を含むカスタマイズされた顧客構造体
type ConfidentialCustomer struct {
CustomerID int64
CreditCard CreditCard
}
// 機密情報を含むカスタマイズされたクレジットカード型
type CreditCard string
// Stringメソッドの実装
func (c CreditCard) String() string {
return "xxxx-xxxx-xxxx-xxxx"
}
// GoStringメソッドの実装
func (c CreditCard) GoString() string {
return "xxxx-xxxx-xxxx-xxxx"
}
func main() {
c := ConfidentialCustomer{
CustomerID: 1,
CreditCard: "4111-1111-1111-1111",
}
// 様々なフォーマットで出力
fmt.Println(c) // マスキングされた出力
fmt.Printf("%v\n", c) // マスキングされた出力
fmt.Printf("%+v\n", c) // マスキングされた出力
fmt.Printf("%#v\n", c) // マスキングされた出力
bytes, _ := json.Marshal(c)
fmt.Println("JSON: ", string(bytes)) // JSON出力では元の値
}
参考