Discover / Security
detect-secrets
by YelpPython
Enterprise-friendly secrets detection to keep credentials out of code.
Maturity: active because commit 123d ago, latest release v1.5.0. Derived from release and commit history, not a rating.
- Stars
- 4.6k
- Forks
- 565
- Downloads / mo
- 7.1M
- Last commit
- 2026-04-02
- License
- Apache-2.0
- Open issues
- 173
Market and trust evidence
Edition not yet matchedNo exact skills.sh identity match is available for this repository. Repository adoption and freshness remain visible above; install momentum is not inferred.
Trust analysis is a screening signal, not a security warranty. Read the ranking and trust methodology.
In practice
Written by AI from this repository’s README · high confidenceExisting secrets in a large repository make scanning noisy, so newly added ones hide among old findings.
Use it when
When you want to freeze known findings in a baseline and alert only on secrets added afterwards.
Not the right pick when
It relies on heuristic regexes and entropy checks, so results are candidates that still need auditing.
Capabilities
- Creates a baseline of secrets already present in a repository
- Runs periodic diffs so only newly committed secrets surface
- Pre commit style usage through detect-secrets-hook
- Many built in detector plugins that can be disabled individually
- Auditing and labelling of baseline results
- Usable from Python scripts through SecretsCollection
Cost: Free and open source
Install
Derived from the published package name in the repository, not from a model.
Video walkthroughs
Third-party YouTube uploads matched to this tool by title, channel and repository name on 2026-08-03. Not made, reviewed or endorsed by SkillPilot. View counts and publish months are as of the match date and the month is approximate. Nothing loads from YouTube until you press play.
What the repository ships
Detected from the actual files in the repository root.
Latest release v1.5.0
Published 2024-05-06
:newspaper: News
- We're adding support for Python 3.10, 3.11 and 3.12 and we dropped support for Python 3.6 and 3.7! We hope this won't be too disruptive for you all. Be aware that in a next release, we'll remove support for Python 3.8 too, as it'll reach EOL in October 2024.
:mega: Release Highlights
- Added support for OS-agnostic baseline files ([#586])
:tada: New Features
- Added a detector for IP addresses ([#692])
- Added a detector for GitLab tokens ([#782])
- Added a detector for Telegram tokens ([#808])
- Added a detector for Pypi and TestPypi tokens ([#819])
- Added a detector for OpenAI tokens ([#823])
Tags
README
detect-secrets
About
detect-secrets is an aptly named module for (surprise, surprise) detecting secrets within a
code base.
However, unlike other similar packages that solely focus on finding secrets, this package is
designed with the enterprise client in mind: providing a backwards compatible, systematic
means of:
- Preventing new secrets from entering the code base,
- Detecting if such preventions are explicitly bypassed, and
- Providing a checklist of secrets to roll, and migrate off to a more secure storage.
This way, you create a
accepting that there may currently be secrets hiding in your large repository
(this is what we refer to as a _baseline_), but preventing this issue from getting any larger,
without dealing with the potentially gargantuan effort of moving existing secrets away.
It does this by running periodic diff outputs against heuristically crafted regex statements,
to identify whether any new secret has been committed. This way, it avoids the overhead of
digging through all git history, as well as the need to scan the entire repository every time.
For a look at recent changes, please see CHANGELOG.md.
If you are looking to contribute, please see CONTRIBUTING.md.
For more detailed documentation, check out our other documentation.
Examples
Quickstart:
Create a baseline of potential secrets currently found in your git repository.
$ detect-secrets scan > .secrets.baseline
or, to run it from a different directory:
$ detect-secrets -C /path/to/directory scan > /path/to/directory/.secrets.baseline
Scanning non-git tracked files:
$ detect-secrets scan test_data/ --all-files > .secrets.baseline
Adding New Secrets to Baseline:
This will rescan your codebase, and:
- Update/upgrade your baseline to be compatible with the latest version,
- Add any new secrets it finds to your baseline,
- Remove any secrets no longer in your codebase
This will also preserve any labelled secrets you have.
$ detect-secrets scan --baseline .secrets.baseline
For baselines older than version 0.9, just recreate it.
Alerting off newly added secrets:
Scanning Staged Files Only:
$ git diff --staged --name-only -z | xargs -0 detect-secrets-hook --baseline .secrets.baseline
Scanning All Tracked Files:
$ git ls-files -z | xargs -0 detect-secrets-hook --baseline .secrets.baseline
Viewing All Enabled Plugins:
$ detect-secrets scan --list-all-plugins
ArtifactoryDetector
AWSKeyDetector
AzureStorageKeyDetector
BasicAuthDetector
CloudantDetector
DiscordBotTokenDetector
GitHubTokenDetector
GitLabTokenDetector
Base64HighEntropyString
HexHighEntropyString
IbmCloudIamDetector
IbmCosHmacDetector
IPPublicDetector
JwtTokenDetector
KeywordDetector
MailchimpDetector
NpmDetector
OpenAIDetector
PrivateKeyDetector
PypiTokenDetector
SendGridDetector
SlackDetector
SoftlayerDetector
SquareOAuthDetector
StripeDetector
TelegramBotTokenDetector
TwilioKeyDetector
Disabling Plugins:
$ detect-secrets scan --disable-plugin KeywordDetector --disable-plugin AWSKeyDetector
If you want to only run a specific plugin, you can do:
$ detect-secrets scan --list-all-plugins | \
grep -v 'BasicAuthDetector' | \
sed "s#^#--disable-plugin #g" | \
xargs detect-secrets scan test_data
Auditing a Baseline:
This is an optional step to label the results in your baseline. It can be used to narrow down your
checklist of secrets to migrate, or to better configure your plugins to improve its signal-to-noise
ratio.
$ detect-secrets audit .secrets.baseline
Usage in Other Python Scripts
Basic Use:
from detect_secrets import SecretsCollection
from detect_secrets.settings import default_settings
secrets = SecretsCollection()
with default_settings():
secrets.scan_file('test_data/config.ini')
import json
print(json.dumps(secrets.json(), indent=2))
More Advanced Configuration:
from detect_secrets import SecretsCollection
from detect_secrets.settings import transient_settings
secrets = SecretsCollection()
with transient_settings({
# Only run scans with only these plugins.
# This format is the same as the one that is saved in the generated baseline.
'plugins_used': [
# Example of configuring a built-in plugin
{
'name': 'Base64HighEntropyString',
'limit': 5.0,
},
# Example of using a custom plugin
{
'name': 'HippoDetector',
'path': 'file:///Users/aaronloo/Documents/github/detect-secrets/testing/plugins.py',
},
],
# We can also specify whichever additional filters we want.
# This is an example of using the function `is_identified_by_ML_model` within the
# local file `./private-filters/example.py`.
'filters_used': [
{
'path': 'file://private-filters/example.py::is_identified_by_ML_model',
},
]
}) as settings:
# If we want to make any further adjustments to the created settings object (e.g.
# disabling default filters), we can do so as such.
settings.disable_filters(
'detect_secrets.filters.heuristic.is_prefixed_with_dollar_sign',
'detect_secrets.filters.heuristic.is_likely_id_string',
)
secrets.scan_file('test_data/config.ini')
Installation
$ pip install detect-secrets
✨🍰✨
Install via brew:
$ brew install detect-secrets
Usage
detect-secrets comes with three different tools, and there is often confusion around which one
to use. Use this handy checklist to help you decide:
- Do you want to add secrets to your baseline? If so, use
detect-secrets scan. - Do you want to alert off new secrets not in the baseline? If so, use
detect-secrets-hook. - Are you analyzing the baseline itself? If so, use
detect-secrets audit.
Adding Secrets to Baseline
$ detect-secrets scan --help
usage: detect-secrets scan [-h] [--string [STRING]] [--only-allowlisted]
[--all-files] [--baseline FILENAME]
[--force-use-all-plugins] [--slim]
[--list-all-plugins] [-p PLUGIN]
[--base64-limit [BASE64_LIMIT]]
[--hex-limit [HEX_LIMIT]]
[--disable-plugin DISABLE_PLUGIN]
[-n | --only-verified]
[--exclude-lines EXCLUDE_LINES]
[--exclude-files EXCLUDE_FILES]
[--exclude-secrets EXCLUDE_SECRETS]
[--word-list WORD_LIST_FILE] [-f FILTER]
[--disable-filter DISABLE_FILTER]
[path [path ...]]
Scans a repository for secrets in code. The generated output is compatible
with `detect-secrets-hook --baseline`.
positional arguments:
path Scans the entire codebase and outputs a snapshot of
currently identified secrets.
optional arguments:
-h, --help show this help message and exit
--string [STRING] Scans an individual string, and displays configured
plugins' verdict.
--only-allowlisted Only scans the lines that are flagged with `allowlist
secret`. This helps verify that individual exceptions
are indeed non-secrets.
scan options:
--all-files Scan all files recursively (as compared to only
scanning git tracked files).
--baseline FILENAME If provided, will update existing baseline by
importing settings from it.
--force-use-all-plugins
If a baseline is provided, detect-secrets will default
to loading the plugins specified by that baseline.
However, this may also mean it doesn't perform the
scan with the latest plugins. If this flag is
provided, it will always use the latest plugins
--slim Slim baselines are created with the intention of
minimizing differences between commits. However, they
are not compatible with the `audit` functionality, and
slim baselines will need to be remade to be audited.
plugin options:
Configure settings for each secret scanning ruleset. By default, all
plugins are enabled unless explicitly disabled.
--list-all-plugins Lists all plugins that will be used for the scan.
-p PLUGIN, --plugin PLUGIN
Specify path to custom secret detector plugin.
--base64-limit [BASE64_LIMIT]
Sets the entropy limit for high entropy strings. Value
must be between 0.0 and 8.0, defaults to 4.5.
--hex-limit [HEX_LIMIT]
Sets the entropy limit for high entropy strings. Value
must be between 0.0 and 8.0, defaults to 3.0.
--disable-plugin DISABLE_PLUGIN
Plugin class names to disable. e.g.
Base64HighEntropyString
filter options:
Configure settings for filtering out secrets after they are flagged by the
engine.
-n, --no-verify Disables additional verification of secrets via
network call.
--only-verified Only flags secrets that can be verified.
--exclude-lines EXCLUDE_LINES
If lines match this regex, it will be ignored.
--exclude-files EXCLUDE_FILES
If filenames match this regex, it will be ignored.
--exclude-secrets EXCLUDE_SECRETS
If secrets match this regex, it will be ignored.
--word-list WORD_LIST_FILE
Text file with a list of words, if a secret contains a
word in the list we ignore it.
-f FILTER, --filter FILTER
Specify path to custom filter. May be a python module
path (e.g.
detect_secrets.filters.common.is_invalid_file) or a
local file path (e.g.
file://path/to/file.py::function_name).
--disable-filter DISABLE_FILTER
Specify filter to disable. e.g.
detect_secrets.filters.common.is_invalid_file
Blocking Secrets not in Baseline
$ detect-secrets-hook --help
usage: detect-secrets-hook [-h] [-v] [--version] [--baseline FILENAME]
[--list-all-plugins] [-p PLUGIN]
[--base64-limit [BASE64_LIMIT]]
[--hex-limit [HEX_LIMIT]]
[--disable-plugin DISABLE_PLUGIN]
[-n | --only-verified]
[--exclude-lines EXCLUDE_LINES]
[--exclude-files EXCLUDE_FILES]
[--exclude-secrets EXCLUDE_SECRETS]
[--word-list WORD_LIST_FILE] [-f FILTER]
[--disable-filter DISABLE_FILTER]
[filenames [filenames ...]]
positional arguments:
filenames Filenames to check.
optional arguments:
-h, --help show this help message and exit
-v, --verbose Verbose mode.
--version Display version information.
--json Print detect-secrets-hook output as JSON
--baseline FILENAME Explicitly ignore secrets through a baseline generated
by `detect-secrets scan`
plugin options:
Configure settings for each secret scanning ruleset. By default, all
plugins are enabled unless explicitly disabled.
--list-all-plugins Lists all plugins that will be used for the scan.
-p PLUGIN, --plugin PLUGIN
Specify path to custom secret detector plugin.
--base64-limit [BASE64_LIMIT]
Sets the entropy limit for high entropy strings. Value
must be between 0.0 and 8.0, defaults to 4.5.
--hex-limit [HEX_LIMIT]
Sets the entropy limit for high entropy strings. Value
must be between 0.0 and 8.0, defaults to 3.0.
--disable-plugin DISABLE_PLUGIN
Plugin class names to disable. e.g.
Base64HighEntropyString
filter options:
Configure settings for filtering out secrets after they are flagged by the
engine.
-n, --no-verify Disables additional verification of secrets via
network call.
--only-verified Only flags secrets that can be verified.
--exclude-lines EXCLUDE_LINES
If lines match this regex, it will be ignored.
--exclude-files EXCLUDE_FILES
If filenames match this regex, it
Truncated. Read the full README on GitHub ↗