0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go 言語を学ぶAdvent Calendar 2023

Day 22

【Go言語】機密情報を扱うフィールドの定義と出力書式のカスタマイズ

Posted at

Go言語で機密情報の取り扱いをする方法を説明する。
氏名、住所、クレジットカード番号などの個人情報や、顧客情報や仕入先リストなどの機密データの取り扱いは注意が必要になる。
不適切なログ出力によって、これらの情報が不要な箇所で露呈してしまわないようにする必要がある。

実装方法

Goのfmtパッケージに含まれるStringerGoStringerという二つのインターフェースを実装することで、クレジットカード番号などの機密情報の出力フォーマットをカスタマイズできる。

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出力では元の値
}

参考

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?