EonaCat SecretsManager
$ dotnet add package EonaCat.SecretsManagerStore your secrets securely using the EonaCat.SecretsManager.
// Create secrets manager with file provider and encryption
var secretsManager = new SecretsManager()
.WithEncryption("MySecretEncryptionKey123!")
.WithProvider(new FileSecretsProvider("./secrets"));
// Store different types of secrets
await secretsManager.SetSecretAsync("database-password", "MySecurePassword123!");
await secretsManager.SetApiKeyAsync("openai", "sk-1234567890abcdef");
await secretsManager.SetConnectionStringAsync("maindb", "Server=localhost;Database=MyApp;Trusted_Connection=true;");
// Store complex objects
var config = new { ApiUrl = "https://api.example.com", Timeout = 30 };
await secretsManager.SetSecretAsync("api-config", config, TimeSpan.FromHours(24));
// Retrieve secrets
var dbPassword = await secretsManager.GetSecretStringAsync("database-password");
var apiKey = await secretsManager.GetApiKeyAsync("openai");
var connectionString = await secretsManager.GetConnectionStringAsync("maindb");
var apiConfig = await secretsManager.GetSecretAsync<dynamic>("api-config");
Console.WriteLine($"Database Password: {dbPassword}");
Console.WriteLine($"API Key: {apiKey}");
Console.WriteLine($"Connection String: {connectionString}");
// Rotate a secret
await secretsManager.RotateSecretAsync("database-password", async currentValue =>
{
// In real scenarios, this would generate a new password and update the database
return GenerateNewPassword();
});
// Get metadata
var metadata = await secretsManager.GetSecretMetadataAsync("database-password");
if (metadata != null)
{
Console.WriteLine($"Secret accessed {metadata.AccessCount} times");
Console.WriteLine($"Last accessed: {metadata.LastAccessedAt}");
}
}
private static string GenerateNewPassword()
{
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*";
var random = new Random();
return new string(Enumerable.Repeat(chars, 16)
.Select(s => s[random.Next(s.Length)]).ToArray());
}