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

Prismを使った型安全な暗号化_関数型まつり2026

Avatar for _fhhmm _fhhmm
July 12, 2026

 Prismを使った型安全な暗号化_関数型まつり2026

Avatar for _fhhmm

_fhhmm

July 12, 2026

Other Decks in Programming

Transcript

  1. 2 自己紹介 • 高橋 俊史 / Toshifumi Takahashi • @_fhhmm

    • 株式会社FOLIO • 顧客基盤ユニット • toCロボアドサービスのバックエンド開発・保守運用 • 以前はFXシステムやHR系SaaSの開発など
  2. 4 User (Schema Model)の各フィールドはどのような型にするのが考える User(Entity) name: Name email: Email User(Schema

    Model) encryptedName: ??? encryptedEmail: ??? users encrypted_name encrypted_email はじめに 氏名やメールアドレスを暗号化してDBに保存するケースについて
  3. 6 はじめに 専用の暗号化後の型を考えてみる User(Entity) name: Name email: Email User(Schema Model)

    encryptedName: EncryptedName encryptedEmail: EncryptedEmail • バリューオブジェクトとセットで暗号化後の型を都度定義しなければならない • 処理の共通化がしづらい
  4. 7 Encrypyed[T] には、下記の操作が必要 • 暗号化処理: T を暗号化して Encrypted[T] を作れる •

    復号処理: Encrypted[T] を復号して T に戻せる Encrypted[T], Encryptable[T] 共通化のためにEncrypted[T]を考える T Encrypted[T]
  5. 10 Encryptable[T] は、下記の操作を担う • T から String への変換: 基本的に必ず成功するものとしてOK •

    String から T への変換: 失敗する可能性も考慮する必要がある e.g. Name のドメインルールへの抵触 Encrypted[T], Encryptable[T] TとStringの間の変換ルールをEncryptable[T]で表現する Encrypted[T] T String 暗号アルゴリズム Encryptable[T]
  6. 13 Encryptable[T] は、下記の2つを表現する • T を String に変換できる • i.e.

    T は暗号化できる • (失敗するかもしれないが、) String から T に変換できる • i.e. (失敗するかもしれないが、) T に復号できる Encrypted[T], Encryptable[T] TとStringの間の変換ルールをEncryptable[T]で表現する Encrypted[T] T String 暗号アルゴリズム Encryptable[T]
  7. 15 • B => A (必ず変換できる) は暗号化処理の表現 • A =>

    Option[B] (変換に失敗するかもしれない) は復号処理の表現 として利用できる Prism[A, B] とは、B => A , A => Option[B] の2つから構成される Prismの活用 Prismとは https://gakuzzzz.github.io/slides/refactoring_in_scala/#35 を参考に作成
  8. 19 • 暗号化後の型を Array[Byte] とすると、型安全が失われてしまう • また、各暗号化後の型を用意しても、管理の手間が増えたり、処理の共通化がしづらい • Encrypted[T] とすることで、暗号化後も元の型情報を残すことができ、

    暗号化/復号の枠組みを共通化することもできる • Prismを活用した Encryptable[T] を使うことで、暗号化可能であることや、 T の暗号化ルールを表すことができる まとめ