Kapela.Security.Encryption.Files 10.1.0

Prefix Reserved
dotnet add package Kapela.Security.Encryption.Files --version 10.1.0
                    
NuGet\Install-Package Kapela.Security.Encryption.Files -Version 10.1.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Kapela.Security.Encryption.Files" Version="10.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Kapela.Security.Encryption.Files" Version="10.1.0" />
                    
Directory.Packages.props
<PackageReference Include="Kapela.Security.Encryption.Files" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Kapela.Security.Encryption.Files --version 10.1.0
                    
#r "nuget: Kapela.Security.Encryption.Files, 10.1.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Kapela.Security.Encryption.Files@10.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Kapela.Security.Encryption.Files&version=10.1.0
                    
Install as a Cake Addin
#tool nuget:?package=Kapela.Security.Encryption.Files&version=10.1.0
                    
Install as a Cake Tool

🔐 Kapela.Security.Encryption.Files

Extension fichiers de Kapela.Security.Encryption : chiffrez et stockez des fichiers dans un coffre sur disque, organisés en arborescence dérivée d'un GUID, puis rechargez-les en clair.


📩 Installation

dotnet add package Kapela.Security.Encryption.Files

Le package dépend de Kapela.Security.Encryption (chiffrement AES-GCM authentifié).


🚀 Utilisation

Le coffre (SaveVaultFile / LoadVaultFile — stockage auto-gĂ©rĂ© avec arborescence dĂ©rivĂ©e d'un Guid) s'utilise via le service injectĂ© KapelaFilesVault, enregistrĂ© avec AddKapelaFilesVault. Pour un stockage Ă  chemin libre, voir SaveFile / LoadFile, disponibles sur la façade statique EncryptionHelper ou sur tout EncryptionContext.

Enregistrer le coffre depuis la configuration (recommandé)

Liez les options à une section de configuration (par défaut FileVaultOptions) :

// appsettings.json
{
  "FileVaultOptions": {
    "RootFolderPath": "C:\\coffre",
    "Key": "ma-clĂ©",              // optionnel — voir « ClĂ© de chiffrement »
    "RequireDedicatedKey": true   // optionnel — interdit le repli sur la clĂ© de l'application
  }
}
builder.Services.AddKapelaFilesVault(builder.Configuration);
// 
ou avec un nom de section personnalisé :
builder.Services.AddKapelaFilesVault(builder.Configuration, "MonCoffre");

La propriĂ©tĂ© Key est marquĂ©e [Encrypted] : vous pouvez donc stocker la Key chiffrĂ©e (avec la clĂ© par dĂ©faut de l'application) — dans appsettings.json comme via l'action de configuration. Elle est dĂ©chiffrĂ©e Ă  l'enregistrement ; une valeur en clair est conservĂ©e telle quelle.


ou depuis le Program.cs

Préconfigurez le dossier racine (et, optionnellement, la clé) une seule fois :

using Kapela.Security.Encryption.Files;

builder.Services.AddKapelaFilesVault(o =>
{
    o.RootFolderPath = @"C:\coffre";
    o.Key = "ma-clé"; // optionnel
});

Le coffre est enregistré en singleton. Seul RootFolderPath est obligatoire : AddKapelaFilesVault lÚve une ArgumentException s'il est null ou vide.

Enregistrer / recharger un fichier

Injectez KapelaFilesVault puis appelez SaveVaultFile / LoadVaultFile sans répéter le dossier racine :

public class MonService(KapelaFilesVault vault)
{
    public Guid Enregistrer(byte[] contenu) => vault.SaveVaultFile(contenu);
    public byte[] Recharger(Guid id)        => vault.LoadVaultFile(id);
}

SaveVaultFile chiffre le contenu, génÚre un Guid, écrit le fichier chiffré et retourne l'identifiant à conserver pour le relire.

La clé employée dépend du niveau de gestion retenu, décrit dans la section suivante.


đŸ—ïž ClĂ© de chiffrement

Le coffre rĂ©sout sa clĂ© Ă  chaque appel, en descendant trois niveaux jusqu'Ă  en trouver une. Vous choisissez le niveau en fonction du pĂ©rimĂštre que doit couvrir une mĂȘme clĂ© :

Niveau Comment Portée d'une clé
1 — Aucune clĂ© ne rien faire toute l'application
2 — ClĂ© configurĂ©e FileVaultOptions.Key tout le coffre
3 — ClĂ© par appel paramĂštre key de SaveVaultFile / LoadVaultFile un seul fichier

PrĂ©cĂ©dence : paramĂštre > options > clĂ© par dĂ©faut de l'application. Une valeur null ou vide passe simplement au niveau suivant — les trois niveaux se combinent donc librement : un coffre avec une Key configurĂ©e accepte trĂšs bien des clĂ©s par appel pour les quelques fichiers qui le mĂ©ritent. Le dernier repli, celui sur la clĂ© de l'application, peut ĂȘtre interdit via RequireDedicatedKey (voir niveau 2).

Niveau 1 — clĂ© par dĂ©faut de l'application

Sans clé nulle part, le coffre s'appuie sur la clé par défaut de l'application.

builder.Services.AddKapelaFilesVault(o => o.RootFolderPath = @"C:\coffre");

// 
puis, par appel :
Guid id = vault.SaveVaultFile(contenu);
byte[] clair = vault.LoadVaultFile(id);

Niveau 2 — clĂ© dĂ©diĂ©e au coffre

Renseignez FileVaultOptions.Key à l'enregistrement du coffre : tous les fichiers sont alors chiffrés avec cette clé, distincte de celle de l'application.

builder.Services.AddKapelaFilesVault(o =>
{
    o.RootFolderPath = @"C:\coffre";
    o.Key = "clé-du-coffre";
});

Rappel : Key Ă©tant marquĂ©e [Encrypted], cette valeur peut ĂȘtre stockĂ©e chiffrĂ©e aussi bien ici que dans appsettings.json.

Le repli du niveau 1 a une contrepartie : une Key mal orthographiée, ou une section de configuration absente, passe silencieusement sur la clé applicative. Les nouveaux fichiers s'écrivent alors avec la mauvaise clé, et l'erreur ne se manifeste qu'à la relecture des anciens, sous forme de SecurityException. Pour les coffres dont la clé n'est pas négociable, activez le garde-fou :

builder.Services.AddKapelaFilesVault(o =>
{
    o.RootFolderPath = @"C:\coffre";
    o.Key = builder.Configuration["Coffre:Cle"];
    o.RequireDedicatedKey = true; // interdit le repli sur la clé de l'application
});

Avec RequireDedicatedKey = true, tout appel qui n'obtient de clé ni en paramÚtre ni dans les options lÚve une InvalidOperationException au lieu de se replier. Le contrÎle a lieu à l'appel et non à l'enregistrement : la combinaison RequireDedicatedKey = true sans Key reste valide pour un coffre piloté exclusivement en niveau 3.

Niveau 3 — une clĂ© par fichier

Passez la clé en paramÚtre : elle prime sur tout le reste, pour cet appel uniquement.

// Une clé dérivée du locataire : un fichier n'est relisible qu'avec la clé de son tenant.
Guid id = vault.SaveVaultFile(contenu, $"tenant-{tenantId}");
byte[] clair = vault.LoadVaultFile(id, $"tenant-{tenantId}");

Deux points Ă  garder en tĂȘte :

  • La clĂ© n'est pas stockĂ©e avec le fichier. C'est Ă  l'appelant de savoir la reproduire Ă  la relecture (la dĂ©river d'un identifiant mĂ©tier, la conserver dans un coffre Ă  secrets
). Une clĂ© perdue = un fichier dĂ©finitivement illisible : le chiffrement est authentifiĂ©, il n'y a pas de rĂ©cupĂ©ration partielle.
  • Une mauvaise clĂ© lĂšve une SecurityException, elle ne rend jamais un contenu corrompu — la signature est vĂ©rifiĂ©e avant tout dĂ©chiffrement.

📁 Chemin libre (SaveFile / LoadFile)

Si vous voulez maßtriser entiÚrement l'emplacement et le nom du fichier (sans arborescence GUID), utilisez SaveFile / LoadFile. Le fichier est chiffré et écrit exactement au chemin fourni (les dossiers parents manquants sont créés) :

using var context = EncryptionHelper.CreateContext("ma-clé");

context.SaveFile(contenu, @"C:\coffre\contrats\2026\contrat-42.bin");
byte[] clair = context.LoadFile(@"C:\coffre\contrats\2026\contrat-42.bin");

//  également disponibles sur la façade statique
EncryptionHelper.SaveFile(contenu, @"C:\coffre\contrats\2026\contrat-42.bin");
byte[] clairBis = EncryptionHelper.LoadFile(@"C:\coffre\contrats\2026\contrat-42.bin");

Les trois niveaux de clé s'y retrouvent à l'identique, portés cette fois par le contexte de chiffrement : appeler SaveFile / LoadFile sur la façade statique EncryptionHelper correspond au niveau 1, sur un EncryptionContext créé une fois pour toutes au niveau 2, et sur un contexte créé par fichier au niveau 3.


đŸ—‚ïž Arborescence de stockage

Pour répartir les fichiers et éviter les dossiers surchargés, le Guid (format "D") est découpé sur -. Chaque groupe sauf le dernier devient un niveau de dossier ; il y a donc autant de niveaux que de groupes moins un. Pour l'identifiant 89a1f524-c4ca-4078-b448-e61417052e70 :

C:\coffre\
└── 89a1f524\
    └── c4ca\
        └── 4078\
            └── b448\
                └── 89a1f524-c4ca-4078-b448-e61417052e70   ← fichier chiffrĂ©
  • Niveaux de dossiers : les groupes du GUID, sauf le dernier (soit 4 niveaux pour un GUID standard).
  • Nom du fichier : le GUID complet (format "D"), sans extension.

Les dossiers manquants sont créés automatiquement à l'enregistrement.

Pour obtenir le chemin complet d'un fichier sans accĂšs disque (le fichier peut ne pas exister), utilisez vault.ResolveVaultPath(id).


⚠ Gestion des erreurs

Opération Exception Cause
AddKapelaFilesVault ArgumentException RootFolderPath est null ou vide.
AddKapelaFilesVault ArgumentNullException action, configuration ou configSectionName est null.
SaveVaultFile ArgumentNullException content est null.
SaveVaultFile / LoadVaultFile InvalidOperationException Aucune clé dédiée (ni dans les options, ni en paramÚtre) alors que RequireDedicatedKey est activé.
LoadVaultFile FileNotFoundException Aucun fichier pour l'identifiant fourni.
LoadVaultFile SecurityException Signature invalide (mauvaise clé ou fichier altéré).
SaveFile / LoadFile ArgumentException fullPath est null ou vide.
SaveFile ArgumentNullException content est null.
LoadFile FileNotFoundException Aucun fichier au chemin fourni.
LoadFile SecurityException Signature invalide (mauvaise clé ou fichier altéré).

📄 Licence

MIT — Copyright (c) Kapela 2026

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
10.1.0 127 8/28/2026
10.0.1 243 6/10/2026
10.0.0 120 6/9/2026