A C# port of Yelp/detect-secrets β an entropy-based secrets detection library.
Scans files, diffs, and ad-hoc strings for AWS keys, GitHub tokens, OpenAI keys, private keys, passwords, and 20+ other secret types.
dotnet add package DetectSecretsSharpusing DetectSecretsSharp.Core;
using DetectSecretsSharp.Plugins;
// Scan a string with all 27 built-in detectors
var results = SecretsCollection.ScanLineDefault(
"GITHUB_TOKEN=ghp_abc123ABC456def789GHI012jkl345MNO678");
foreach (var (filename, secret) in results)
{
Console.WriteLine($"{filename}:{secret.Type} β {secret.SecretValue}");
}
// Output: adhoc-string-scan:GitHub Token β ghp_abc123ABC456def789GHI012jkl345MNO678dotnet add package DetectSecretsSharp
Or via NuGet Package Manager:
Install-Package DetectSecretsSharp
Target: .NET Standard 2.0+ (compatible with .NET Framework 4.6.1+, .NET Core 2.0+, .NET 5+)
// With default detectors (all 27)
var results = SecretsCollection.ScanLineDefault("AKIA1234567890ABCDEF");
// With custom detectors
var results = SecretsCollection.ScanLine(
"password = \"supersecret\"",
filename: "config.env",
new KeywordDetector(), new AwsKeyDetector());
// Async version
var results = await SecretsCollection.ScanLineAsync("sk-live_...", ".env",
new StripeDetector());var scanner = new Scanner(new DetectorBase[] {
new AwsKeyDetector(),
new GitHubTokenDetector(),
new OpenAiDetector()
});
var secrets = scanner.ScanFile("config.env");var scanner = Scanner.CreateDefault();
var results = scanner.ScanFiles(new[] { "file1.env", "file2.yaml" });
// Async parallel scanning
var results = await scanner.ScanFilesAsync(new[] { "file1.env", "file2.yaml" });var diff = @"--- a/config.env
+++ b/config.env
@@ -0,0 +1 @@
+SLACK_TOKEN=xoxb-123456789012-123456789012-abc123def456ghi789jkl012mno345pqr";
var scanner = new Scanner(new DetectorBase[] { new SlackDetector() });
var results = scanner.ScanDiff(diff);// Export to baseline
var baseline = secrets.ToBaselineDictionary();
string json = JsonSerializer.Serialize(baseline);
// Load from baseline
var loaded = SecretsCollection.LoadFromBaseline(baseline);// Merge old results (preserves verification status)
current.Merge(oldResults);
// Trim: remove false positives that no longer exist
current.Trim(scannedResults);
// Subtraction: behave like set difference
var diff = current - oldResults;| Detector | Secret Type | Has Verify |
|---|---|---|
AwsKeyDetector |
AWS Access Key | β (STS API) |
AzureStorageKeyDetector |
Azure Storage Account Key | β |
ArtifactoryDetector |
Artifactory Credentials | β |
BasicAuthDetector |
Basic Auth Credentials | β |
Base64HighEntropyStringDetector |
Base64 High Entropy String | β |
CloudantDetector |
Cloudant Credentials | β |
DiscordBotTokenDetector |
Discord Bot Token | β |
GitHubTokenDetector |
GitHub Token | β |
GitLabTokenDetector |
GitLab Token | β |
HexHighEntropyStringDetector |
Hex High Entropy String | β |
IbmCloudIamDetector |
IBM Cloud IAM Key | β |
IbmCosHmacDetector |
IBM COS HMAC Credentials | β |
IpPublicDetector |
Public IP (ipv4) | β |
JwtTokenDetector |
JSON Web Token | β (format validation) |
KeywordDetector |
Secret Keyword | β |
MailchimpDetector |
Mailchimp Access Key | β |
NpmDetector |
NPM tokens | β |
OpenAiDetector |
OpenAI Token | β |
PrivateKeyDetector |
Private Key | β |
PypiTokenDetector |
PyPI Token | β |
SendGridDetector |
SendGrid API Token | β |
SlackDetector |
Slack Token | β |
SoftlayerDetector |
SoftLayer Credentials | β |
SquareOAuthDetector |
Square OAuth Secret | β |
StripeDetector |
Stripe Access Key | β |
TelegramBotTokenDetector |
Telegram Bot Token | β |
TwilioKeyDetector |
Twilio API Key | β |
public class MyCustomDetector : RegexBasedDetector
{
public override string SecretType => "My Custom Secret";
protected override IEnumerable<Regex> DenyList => new[]
{
new Regex(@"CUSTOMKEY-[A-Z0-9]{16}", RegexOptions.Compiled)
};
}
// Usage
var results = SecretsCollection.ScanLine(
"CUSTOMKEY-ABCD1234EFGH5678",
detectors: new MyCustomDetector());Several detectors support online verification via external APIs (AWS STS, Slack, Stripe, Telegram, etc.):
// Sync (blocks thread)
var result = detector.Verify(secret);
// Async (preferred)
var result = await detector.VerifyAsync(secret);
// With code context
var context = CodeSnippet.FromSingleLine(line, lineNumber);
var result = await detector.VerifyAsync(secret, context);DetectSecretsSharp
βββ Core
β βββ PotentialSecret # Secret data model
β βββ SecretsCollection # Collection of secrets by file
β βββ Scanner # File/diff/string scanner
βββ Plugins
β βββ DetectorBase # Abstract base detector
β βββ RegexBasedDetector # Regex-based detector (90% of plugins)
β βββ 27 concrete detectors
βββ Util
βββ CodeSnippet # Code context for verification
βββ FileType # File type detection
MIT License β see LICENSE.
- Original Python project: Yelp/detect-secrets
- Port author: RomeCore