Generates Obfuscated Properties from `.env` File Content
$ dotnet add package EnvObfuscator
public static Memory<char> properties for each .env entry.Validate_<PropertyName>(ReadOnlySpan<char>) for constant-time comparison.
To avoid embedding "raw data" as an assembly metadata, EnvObfuscator uses preceding block comment as a source.
using EnvObfuscator;
/*
# 👇 Copy & paste .env file content
API_KEY=abc123
SERVICE_URL=https://example.com
SECRET=PA$$WORD
EMPTY=
*/
[Obfuscate(seed: 12345)] // Omit the argument to use random seed
static partial class EnvSecrets
{
}
How to use the generated properties:
// Always returns a freshly decoded clone each time
var apiKey = EnvSecrets.API_KEY;
var cache = apiKey.ToString();
// Consuming decoded data...
// Zeroing out the span — more for peace of mind than actual security
apiKey.Span.Clear();
cache = "";
// Validation (no decoding, full-length compare to avoid timing differences)
if (EnvSecrets.Validate_SECRET("PA$$WORD"))
{
//...
}
0 is allowed but warned (deterministic and predictable).[!IMPORTANT] Obfuscated name collisions can surface as compiler errors, e.g.:
error CS0101: The namespace '<random_namespace>' already contains a definition for '<random_class>'or similar.
# line is parsed as KEY=VALUE (split on the first =).
= after the first.Validate_<PropertyName>(ReadOnlySpan<char>) short-circuits only on length mismatch, then performs a full-length compare to avoid leaking timing information.Span.Clear() after use to zero sensitive data.seed (if provided) controls the output deterministically.
[!NOTE] Values are trimmed; leading/trailing spaces are not preserved.