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
<PackageReference Include="Kapela.Security.Encryption.Files" Version="10.1.0" />
<PackageVersion Include="Kapela.Security.Encryption.Files" Version="10.1.0" />
<PackageReference Include="Kapela.Security.Encryption.Files" />
paket add Kapela.Security.Encryption.Files --version 10.1.0
#r "nuget: Kapela.Security.Encryption.Files, 10.1.0"
#:package Kapela.Security.Encryption.Files@10.1.0
#addin nuget:?package=Kapela.Security.Encryption.Files&version=10.1.0
#tool nuget:?package=Kapela.Security.Encryption.Files&version=10.1.0
đ 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 | Versions 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. |
-
net10.0
- Kapela.Security.Encryption (>= 10.0.4)
- Microsoft.Extensions.Configuration.Binder (>= 10.0.11)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.