AIに貼る前の秘密の検査
コードやログをAIに貼り付けると、資格情報まで一緒に送ってしまいがちです。送ってしまえば取り消せず、その鍵はもう信用できません。先にここを通して、伏せた写しのほうをお使いください。
貼り付けると、打ちながら検査します。
この検査もブラウザの中で動きます。 秘密が漏れていないかを確かめるために、その秘密を他人のサーバへ送っては本末転倒です。それに、すでにどこかへ貼り付けた鍵は、伏せたところで漏れなかったことにはなりません — 失効させて新しく発行してください。
何を探すか
接頭辞が決まっている鍵を見ます。OpenAI の sk-、Anthropic の sk-ant-、GitHub の ghp_、AWS の AKIA・ASIA、Google の AIza、Slack の xox で始まるものです。そのほかに BEGIN PRIVATE KEY で開く PEM、ドット二つで区切られた JWT、user:pass@ を含む URL、名前に SECRET・TOKEN・PASSWORD を含む .env の行です。個人情報は別のスイッチで切り替えます。韓国の住民登録番号、カード番号、010 で始まる携帯番号、メールアドレスを見ます。
伏せ方
見つけたものを丸ごとアスタリスクで覆うのではなく、先頭の4文字と末尾の4文字を残します。どの鍵だったかが分からなければ失効させて差し替えられませんし、全部覆ってしまうと何が何だか区別できないからです。8文字以下は全部覆います。何行目にあったかも一緒に記録し、見つかったものが500件を超えたらそこで止まります。
誤った警告と見逃し
形で探すので、16桁の注文番号はカード番号として、文書中の example.com のアドレスは個人情報として引っかかります。逆に Stripe の sk_live_ のように一覧に無い接頭辞や、データベースのパスワードのようなランダムな文字列は素通りします。電話番号の規則は 01 で始まる韓国の携帯番号(010・011・016・017・018・019)しか知らないので、他の国の番号は捕まえません。警告を消すために規則を緩めるのではなく、確実なものだけを赤で示し、残りは黄色にしています。
伏せた文は元より短くなります
アスタリスクは十二個までしか使いません。三十文字の鍵も、先頭四文字・アスタリスク十二・末尾四文字の二十文字に縮むので、伏せた文の行の長さは元と違います。同じ鍵が何度も出てくれば、出るたびに数えてすべて伏せます。一覧には見つけたものを六十件まで、一件につき先頭四十文字までしか出しませんが、伏せるのは見つけたもの全部です。
個人情報の規則の形
韓国の住民登録番号は、前六桁・後ろ七桁で後ろの先頭が 1〜4 のものだけを見ます。5〜8 で始まる外国人登録番号は素通りします。カード番号は四桁が四組なので、十五桁を 4-6-5 で区切るアメックスは捕まりません。電話番号は 01 で始まる十桁か十一桁で、ハイフンや空白はあってもなくても構いません。メールアドレスは @ と点があれば捕まえるので、noreply@example.com のような仮の値も引っかかります。
よくある質問
何も出なければ安全ですか
いいえ。形で見分けているので、決まった接頭辞を持つ鍵(sk-、ghp_、AKIA など)は確実に見つかりますが、決まった形の無い社内トークンや、ただのランダムな文字列であるパスワードはすり抜けます。ご自身でも目を通してください。
すでに貼ってしまいました
後から伏せても何も変わりません。その鍵を失効させて、新しく発行してください。会話を消しても、すでに送られたものが消えた保証にはなりません。
この検査はサーバで動いていますか
動いていません。秘密が漏れていないかを調べるために、その秘密を他人のサーバへ送っては本末転倒です。すべてブラウザの中で動き、通信を切ったままでも使えます。
伏せた文章はどう使いますか
伏せた写しのほうを貼り付けてください。値だけをアスタリスクに置き換えるので前後の文脈は残り、モデルには鍵が どこにあるか は見えます — 中身だけが見えません。
一覧が 60 件で切れます。
画面に見えるのが六十件までというだけです。件数は全部数え、伏せた文にも全部反映されます。ただし走査は 501 件で止まるので、それ以上混ざっている文は分けて入れてください。それほど多く捕まるのはたいていメールアドレスや電話番号の列なので、個人情報の検出を切って鍵だけを見るのも一つの手です。