Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go標準の暗号ライブラリメンテナンス戦略

uji
January 17, 2025
440

 Go標準の暗号ライブラリメンテナンス戦略

2025-01-18 Gopher's Gathering

uji

January 17, 2025
Tweet

Transcript

  1. ⾃⼰紹介 • 名前: uji • 神⼾市在住 • NOT A HOTEL

    所属 • Gopher 6年⽣ • KOBE.go, Kyoto.go 運営 https://twitter.com/uji_rb
  2. Goの暗号ライブラリ Goチームがサポートしている暗号ライブラリは2つ • 標準パッケージ crypto ◦ 他の標準ライブラリと同様、後⽅互換性を担保しながら保守される • golang.org/x/crypto ◦

    実験的な実装や、標準ライブラリへの取り込み候補の アルゴリズムがサポート ◦ 他の依存関係と同じようにインストールおよび更新が可能 どちらもGoで独⾃実装されている
  3. • APIの表⾯上の複雑さ(ユーザーが直接利⽤する部分) ◦ コードコメントから⾃動的に API ドキュメントを⽣成するソリューションの おかげで、 ドキュメント化は⾮常に容易で、⽂化に組み込まれている • APIの表⾯下の複雑さ(内部実装)

    ◦ Go は可読性を重要視している⾔語 ◦ ⾔語仕様は⼩さく、演算⼦のオーバーロードや例外などがないので 制御フローは常に明確 複雑さの管理に Goは優れている
  4. 参考:「Why did Go implement its own SSL library?」に対する Rob Pike氏の回答

    「AGL(Adam Langley)のような才能の持ち主がいて、彼がやりたがっていたこと、そしてすべてをGoで実装できたのは 素晴らしいことです。もし暗号化があまりにも難しく、唯⼀の実装しか許されないのであれば、それはGoのライブラリで はなく、暗号化そのものを再考する必要があります。さらに、Goはより安全で、コードがよりクリーンです。そのため、 暗号コードを書くにはCやC++よりも安全な⾔語だと私は主張します。挙げられている問題の多くは、ライブラリの未熟さ によるものであって、実現不可能であることが原因ではありません。 しかし実際には、SSLの作業が⾏われた時点ではcgoが存在していなかったため、Goで実装するのが唯⼀の選択肢だったの です。」 https://groups.google.com/g/golang-nuts/c/0za-R3wVaeQ/m/M8_BiuaZ_2YJ
  5. Goの暗号ライブラリが目指していること • セキュアであること • 安全であること ◦ APIの使い⽅によって事故が起きない ◦ ドキュメントで何ができて何ができないか、 どのようなセキュリティが提供され、何が提供されないかが明確に⽰されている

    • 実⽤的であること ◦ 使⽤するには遅すぎると、役に⽴たないのはもちろん、 独⾃に実装がなされてしまうことで、開発者の管理する複雑さが⽣まれてしまう ◦ パフォーマンスが⼗分であれば、OpenSSL より 20% 低くてもよい • 最先端であること ◦ 従来の実装より良い代替⼿段が登場し、 ⼈々がそれを必要としている場合は早めにサポートを追加する
  6. アセンブリも最⼩限に アセンブリの利⽤ポリシーがWikiに存在 https://go.dev/wiki/AssemblyPolicy 提案issue: https://github.com/golang/go/issues/37168 • アセンブリの使⽤を最⼩限に ◦ アセンブリを 2

    倍使⽤して 55% のスピードアップを実現するよりも、 アセンブリを少量使⽤して 50% のスピードアップを実現する⽅がよい • ⼩さくてテスト可能なユニット (25〜75 ⾏)を実装し、 Go テストで個々のユニットをテストできるように • Go コードに、アセンブリが必要な理由 (具体的なパフォーマンス上の利点、 命令へのアクセスなど) をドキュメントとして記載する
  7. FIPS 140-3 認証 #69536, #70123 現在Go の暗号ライブラリは FIPS 140-3 で検証されておらず、

    Goで認証が必要な場合、cgo で認証済みライブラリを呼び出す必要がある (Go + Boring Crypto GOEXPERIMENT=boringcrypto などを使う) 今後ユーザーは GODEBUG でFIPSモードを指定することで FIPS 140-3 に適合した暗号化を利⽤できるようになる
  8. ポスト量⼦暗号(耐量⼦計算機暗号)サポート #64537 NIST が 最近標準化した ML-KEM (FIPS 203) は、 業界全体に導⼊されはじめており、

    実はGo 1.23 で#67061 の⼀部としてすでに実装されている Go 1.24から、crypto/mlkem として公開パッケージでも ML-KEM がサポートされるようになる
  9. 参考文献 • Maintaining the Go Crypto Libraries https://www.infoq.com/presentations/go-crypto-library/ • Filippo

    Valsorda⽒のブログhttps://words.filippo.io/ • Why did Go implement its own SSL library? https://groups.google.com/g/golang-nuts/c/0za-R3wVaeQ • なぜ WebAssembly ⽣成を Go にしたのか https://voluntas.medium.com/なぜ-webassembly-⽣成を-go-にしたのか-5b5612c86d7b • wolfCrypt組み込み暗号ライブラリ:FIPS認証 https://wolfssl.jp/products/wolfcrypt-fips/