7/31

暗号化処理(秘匿情報を永続化したいユースケース)について質問です。

暗号化、及び復号化はddd的にはどこのレイヤに入れるのが適切なのでしょうか?

1.暗号化は技術的な要因ということでドメインでは全く意識せず、レポジトリレイヤーで保存時に暗号化、取得時に復号化という方法

2.秘匿情報のエンティティをつくったうえで、生成には暗号化されたプロパティを受け取り、そのプロパティにアクセスする時にはgetterを介して、復号化を行った上で取得する。(暗号化する処理はユースケース層で行う想定です)

※暗号化復号化はawsのKMS(外部サービス)を利用する形で行おうと思っています。
もし1で行くと、レポジトリ層で永続化のためのサービス及び暗号化復号化の外部サービスも読んでしまうことになり、責務が広すぎるのかもなという懸念を感じております。


以上を踏まえてどちらの方法(もしくは別の方法でも)が良さそうか、ご意見いただけると嬉しいです。

まず、考慮されている通り、暗号化複合化の知識はドメイン層にもたせたくないですね。 なので基本的には1の実装が良いと思います。 あとは、エンティティ自体が暗号化していること自体を意識する必要があるかどうかによりますね。 エンティティが暗号化を意識せず、あくまで永続化時の問題であれば、リポジトリの実装クラスに閉じ込めるのが良いと思います。その中でも、暗号化、複合化の具体的な処理は別のクラスに移乗してリポジトリの実装クラスからそれを呼ぶだけ、とするとある程度肥大化は抑えられると思います。 一方、エンティティが暗号化を意識する場合、例えば ユーザーオブジェクトがパスワードという属性を持ち、この項目のみ暗号化した値をdbに保持するとします。この場合、エンティティとしては「パスワード」という値をStiringで保持するのではなく「暗号化済パスワード」という型を定義して保持させる方法もあります。 そして、「平文のパスワード」を渡すとに暗号化済パスワード」返してくれるような暗号化処理オブジェクトのインターフェイスをドメイン層に定義して、インフラ層で具体的な実装をします。 「リポジトリはリストのように使う」ので、ユーザーをリポジトリにいれたときは平文、ユーザーをリポジトリから取り出すと一部暗号化、と暗黙的にされると混乱の元になるので、できればそこは明示的に意識できた方がわかりやすいので、このような方針をとります。 この判断の分岐はエンティティに暗号化をドメイン層のオブジェクトを意識させるかどうか、どちらの方が可読性、保守性が高まるか、です。検討してみてください。

スポンサーリンク

スポンサーリンク

スポンサーリンク