HN 日本語サマリー

← 一覧へ戻る
セキュリティ

Captchaはあなたが人間であることを証明する。HATCHAはあなたが人間ではないことを証明する。

Captcha proves you're human. HATCHA proves you're not (github.com)

58 pointsby backlit403467 コメント

要約

HATCHAは、人間にとっては困難だがAIエージェントにとっては簡単な課題(大きな数の乗算、文字列の反転、バイナリデコードなど)を通過させることで、アクセスを制限するリバースCAPTCHAです。 サーバーサイドでの検証を行い、回答はクライアントに到達せず、HMAC署名付きトークンを使用するためステートレスでデータベース不要です。 Next.js App RouterおよびExpressミドルウェア用のフレームワークアダプターが付属し、テーマ設定やカスタムチャレンジの登録も可能です。

全文翻訳

HATCHA CAPTCHAはあなたが人間であることを証明します。HATCHAはあなたが人間ではないことを証明します。HATCHA(Hyperfast Agent Test for Computational Heuristic Assessment)は、AIエージェントにとっては些細なことだが、人間にとっては困難な課題(大きな数の乗算、文字列の反転、バイナリデコードなど)の背後でアクセスを制限するリバースCAPTCHAです。 サーバーサイドでの検証 — 回答は決してクライアントに到達しません。HMAC署名付きトークン、ステートレス、データベース不要。5種類の組み込みチャレンジタイプ — 数学、文字列反転、文字数カウント、ソート、バイナリデコード。拡張可能 — 実行時にカスタムチャレンジジェネレーターを登録できます。テーマ設定可能 — CSSカスタムプロパティを介してダーク、ライト、または自動モード。フレームワークアダプター — Next.js App RouterおよびExpressミドルウェアをすぐに利用できます。 クイックスタート (Next.js) 1. インストール npm install @mondaycom/hatcha-react @mondaycom/hatcha-server 2. APIルートを追加 // app/api/hatcha/[...hatcha]/route.ts import { createHatchaHandler } from "@mondaycom/hatcha-server/nextjs"; const handler = createHatchaHandler({ secret: process.env.HATCHA_SECRET!, }); export const GET = handler; export const POST = handler; 3. レイアウトをラップ // app/layout.tsx import { HatchaProvider } from "@mondaycom/hatcha-react"; import "@mondaycom/hatcha-react/styles.css"; export default function RootLayout({ children }) { return ( <html lang="en"> <body> <HatchaProvider>{children}</HatchaProvider> </body> </html> ); } 4. 検証をトリガー "use client"; import { useHatcha } from "@mondaycom/hatcha-react"; function AgentModeButton() { const { requestVerification } = useHatcha(); return ( <button onClick={() => requestVerification((token) => { console.log("Agent verified!", token); }) } > Enter Agent Mode </button> ); } 5. シークレットを設定 # .env.local HATCHA_SECRET=your-random-secret-here 仕組み Client Server │ │ │ GET /api/hatcha/challenge │ │────────────────────────────────►│ │ │ Generate challenge │ │ Hash answer │ │ HMAC-sign { hash, expiry } { challenge (no answer), token } │◄────────────────────────────────│ │ │ │ Agent solves the challenge │ │ │ │ POST /api/hatcha/verify │ │ { answer, token } │ │────────────────────────────────►│ │ │ Verify HMAC signature │ │ Check expiry │ │ Compare answer hash { success, verificationToken } │ │◄────────────────────────────────│ 回答はクライアントに到達しません。署名されたトークンは不透明であり、ハッシュ化された回答と有効期限のみを含みます。検証はステートレス — データベースは不要です。 チャレンジの種類 タイプ アイコン 実行内容 時間制限 math × 5桁 × 5桁の乗算 30秒 string ↔ 60~80文字のランダムな文字列を反転 30秒 count # 約250文字の中から特定の文字を数える 30秒 sort ⇅ 15個の数字をソートし、k番目に小さい数を返す 30秒 binary 01 バイナリオクテットをASCIIにデコード 30秒 カスタムチャレンジ import { registerChallenge } from "@mondaycom/hatcha-server"; registerChallenge({ type: "hex", generate() { const n = Math.floor(Math.random() * 0xffffff); return { display: { type: "hex", icon: "0x", title: "Hex Decode", description: "Convert this hex number to decimal.", prompt: `0x${n.toString(16).toUpperCase()}`, timeLimit: 30, answer: String(n), }, answer: String(n), }; }, }); テーマ設定 HATCHAは、--hatcha-* のスコープを持つCSSカスタムプロパティを使用します。任意の親要素でこれらをオーバーライドできます。 [data-hatcha-theme] { --hatcha-accent: #3b82f6; --hatcha-accent-light: #60a5fa; --hatcha-bg: #060b18; --hatcha-fg: #e4eaf6; --hatcha-success: #22c55e; --hatcha-danger: #ef4444; } <HatchaProvider>または<Hatcha>に theme="dark"、theme="light"、または theme="auto" を渡します。 Express import express from "express"; import { hatchaRouter } from "@mondaycom/hatcha-server/express"; const app = express(); app.use(express.json()); app.use("/api/hatcha", hatchaRouter({ secret: process.env.HATCHA_SECRET! })); app.listen(3000); パッケージ パッケージ 説明 @mondaycom/hatcha-core チャレンジ生成と暗号化検証 @mondaycom/hatcha-react Reactコンポーネント、プロバイダー、スタイル @mondaycom/hatcha-server Next.jsおよびExpressサーバーハンドラー 開発 git clone https://github.com/mondaycom/HATCHA.git cd HATCHA pnpm install pnpm build cd examples/nextjs-app pnpm dev コントリビューション コントリビューションを歓迎します!セットアップ手順とガイドラインについてはCONTRIBUTING.mdを参照してください。 ライセンス MIT