GitHubは最近、すべてのトークンについて新しいフォーマットに移行した。トークンには、パーソナルアクセストークン、OAuthアクセストークン、ユーザtoサーバトークンとサーバtoサーバトークン、リフレッシュトークンがある。GitHubのエンジニアであるHeather Harvey氏の説明によると、新しいフォーマットは、リポジトリでシークレットをスキャンする場合などに、トークンをより簡単に識別できるようにし、コラボレーションを増やすことを目的としている。
GitHubは、さまざまなトークンを使用してAPIへのアクセスを制御する。パーソナルアクセストークンは、ユーザ名とパスワードを使用する代わりに認証に使用する。OAuthアクセストークンは、Webブラウザにアクセスできないアプリに対してOAuth 2.0プロトコルを実装する。GitHubアプリのUser-to-ServerトークンとGitHubアプリのServer-to-Serverトークンは、ユーザに代わってGitHubアプリのリポジトリへのアクセスを許可するために使用される。リフレッシュトークンは、User-to-Serverトークンをリフレッシュするために使用される。
外からは、トークンフォーマットの変更は非常に小さいように見える。新しい3文字のプレフィックスのみがあり、許可されている文字セットが拡張されている。しかし、これらの変更は、いくつかの望ましい特性につながるとHarvey氏は言っている。
まず、新しい3文字のプレフィックスにより、トークンの識別可能性が向上する。たとえば、ghp
プレフィックスはGitHubパーソナルアクセストークンで使用され、gho
はOAuthアクセストークンのプレフィックスとして使用される。トークンプレフィックスの最初の2文字はトークンを作成した会社を示し、3番目の文字はトークンの種類を示す。GitHubで使用されている他のプレフィックスは、User-to-Serverトークンの場合はghu
、Server-to-Serverトークンの場合はghs
、リフレッシュトークンの場合はghr
である。
このプレフィックスによってだけでも、シークレットスキャンの誤検知率は0.5%に低下すると予想されます。
あまり目立っていないが、GitHubは、トークンの最後の6文字を32ビットチェックサムに使用することも決定した。シークレットスキャンの信頼性をさらに高めることを目的としている。
標準のチェックサムアルゴリズムであるCRC32アルゴリズムから実装を開始します。次に、必要に応じて0パディングを使って、Base62実装で結果をエンコードします。
3文字のプレフィックス、アンダースコアセパレータ、チェックサムを考慮すると、トークンに対して利用できる長さが10文字短くなり、作成できる一意のトークンの数に悪影響を及ぼす。これに対抗するために、GitHubは、トークンの長さを同じに保ちながら、トークンに許可される文字セットを拡張した。以前の文字セットでは16進数の表現しかできなかったが、新しい文字セットには小文字と大文字、および0から9までの10進数が含まれる。これらすべての変更の結果、GitHubトークンのエントロピーが高くなった。たとえば、OAuthトークンの場合、エントロピーは160から178になった。
これらの変更は、ユーザとインテグレーターに対して完全に公開されている。ただし、ユーザがパーソナルアクセスとOAuthトークンをリセットして、今すぐ新しいフォーマットを使用することを希望するかどうかは別である。ただし、GitHubは、2021年6月1日以降、最大255文字のトークンをサポートする計画も発表した。これにより、インテグレーターはトークンに対して特定のサポートを追加する必要が生じる可能性がある。