Rexact
Cheatsheet

Regex GitHub access token (ghp_, github_pat_…)

Since 2021, a GitHub token starts with a three-letter prefix (gh + type initial: ghp personal, gho OAuth, ghu user-to-server, ghs installation, ghr refresh) followed by '_'. GitHub states the token is encoded in Base62 and its last 6 characters are a CRC32 checksum; the total length stays at 40 characters, i.e. 36 after the prefix. Fine-grained tokens start with github_pat_; their 82-character length after the prefix is not documented by GitHub but taken from detectors. The four tools I read disagree: one only covers ghp_, another ignores github_pat_, a third accepts 36 to 255 characters, and three accept an underscore in the body, which the Base62 alphabet excludes. Here's an anchored pattern, compared against those tools.

/^(?:gh[pousr]_[A-Za-z0-9]{36}|github_pat_[A-Za-z0-9_]{82})$/
passes 24/24 cases

Comparison of existing patterns

Implementation

const re = new RegExp("^(?:gh[pousr]_[A-Za-z0-9]{36}|github_pat_[A-Za-z0-9_]{82})$", "");
re.test(input);

Limits

  • Valide seulement la FORME : ne vérifie ni la somme de contrôle CRC32 (6 derniers caractères, encodée en Base62), ni que le jeton existe ou est encore actif. Un jeton bien formé mais inventé passe ce motif.
  • Seuls les formats à 40 caractères (préfixe + 36) et github_pat_ + 82 sont acceptés. GitHub annonce un nouveau format ghs_APPID_JWT pour les jetons d'installation d'applications, bien plus long : il est rejeté ici et demande un autre motif.
  • La longueur de 82 caractères de github_pat_ n'est pas documentée par GitHub (seul le préfixe l'est) : elle est reprise de gitleaks, trufflehog et secretlint et peut changer. Le motif exclut le tiret bas des jetons classiques, contrairement aux détecteurs, d'après l'encodage Base62 décrit par GitHub.
  • Ne collez jamais un vrai jeton dans un outil en ligne : utilisez des jetons factices pour vos tests. Pour détecter des jetons dans du texte, retirez les ancres et entourez de \b.

Related pages