暗号化
Collection field: EncryptionProfessional Edition+概要
顧客の携帯電話番号、メールアドレス、カード番号などのプライベートな業務データは暗号化できます。暗号化後は、暗号文としてデータベースに保存されます。

暗号化方式
プラグインは自動的に应用密钥を生成し、そのキーを /storage/apps/main/encryption-field-keys ディレクトリに保存します。
应用密钥のファイル名はキー ID で、拡張子は .key です。ファイル名は任意に変更しないでください。
应用密钥ファイルは大切に保管してください。应用密钥ファイルを紛失すると、暗号化データを復号できなくなります。
子アプリケーションでプラグインを有効にした場合、キーのデフォルト保存先は /storage/apps/${子应用name}/encryption-field-keys です。
仕組み
エンベロープ暗号化方式を採用しています。

キーの作成フロー
- 初めて暗号化フィールドを作成すると、システムは自動的に 32 ビットの
应用密钥を生成し、base64 エンコードしてデフォルトの保存先に保存します。 - 新しい暗号化フィールドを作成するたびに、そのフィールド用のランダムな 32 ビットの
字段密钥を生成し、应用密钥とランダムに生成した 16 ビットの字段加密向量を使用して暗号化します(AES暗号化アルゴリズム)。その後、fieldsテーブルのoptionsフィールドに保存します。
フィールド暗号化フロー
- 暗号化フィールドにデータを書き込むたびに、まず
fieldsテーブルのoptionsフィールドから、暗号化された字段密钥と字段加密向量を取得します。 应用密钥と字段加密向量を使用して暗号化された字段密钥を復号し、その後、字段密钥とランダムに生成した 16 ビットの数据加密向量を使用してデータを暗号化します(AES暗号化アルゴリズム)。- 復号した
字段密钥を使用してデータに署名し(HMAC-SHA256ダイジェストアルゴリズム)、base64 エンコードして文字列に変換します(生成された数据签名は後続のデータ検索に使用されます)。 - 16 ビットの
数据加密向量と暗号化された数据密文をバイナリ連結し、base64 エンコードして文字列に変換します。 数据签名の base64 エンコード文字列と、連結した数据密文の base64 エンコード文字列を「.」で区切って連結します。- 最終的に連結された文字列をデータベースに保存します。
環境変数
应用密钥を指定する場合は、環境変数 ENCRYPTION_FIELD_KEY_PATH を使用します。プラグインは、そのパスにあるファイルを应用密钥として読み込みます。
应用密钥のファイル形式には、 次の要件があります。
- ファイル拡張子は必ず
.keyであること。 - ファイル名はキー ID として使用されるため、一意性を保証できる uuid の使用を推奨します。
- ファイルの内容は、base64 エンコードされた 32 ビットのバイナリデータであること。
フィールド設定

暗号化後のフィルタリングへの影響
暗号化されたフィールドでサポートされる操作は、次のとおりです:等しい、等しくない、存在する、存在しない。

データのフィルタリング方法:
- 暗号化フィールドの
字段密钥を取得し、应用密钥を使用して字段密钥を復号します。 字段密钥を使用してユーザーが入力した検索テキストに署名します(HMAC-SHA256ダイジェストアルゴリズム)。- 署名済みの検索テキストに
.区切り文字を連結し、データベース内で暗号化フィールドの前方一致検索を実行します。
キーのローテーション
キーのローテーションコマンド nocobase key-rotation を使用する前に、アプリケーションでこのプラグインが読み込まれていることを確認してください。
アプリケーションを新しい環境に移行した後、旧環境と同じキーを使い続けたくない場合は、nocobase key-rotationコマンドを使用して应用密钥を置き換えることができます。
キーのローテーションコマンドを実行するには、旧環境のアプリケーションキーを指定する必要があります。コマンドを実行すると、新しいアプリケーションキーが生成され、古いキーと置き換えられます。新しいアプリケーションキーは、base64 エンコードされてデフォルトの保存先に保存されます。
子アプリケーションの应用密钥を置き換える場合は、--app-nameパラメータを追加して、子アプリケーションのnameを指定する必要があります。

