TOOLS
Network:Arbitrum Sepolia
TOOLS
SIWE Generator
EIP-4361Sign-In with Ethereum (SIWE) メッセージの生成・署名・検証ツール。ゲームやdAppのウォレットログイン実装に必要な署名を安全に生成できます。
ステップ 1
チェーン & ウォレット
選択中のチェーン
chainId: 421614
ウォレット chainId: 421614
接続アドレス: 未接続
送信前にウォレット接続が必要です。
ステップ 2
メッセージパラメータ
EIP-4361準拠のSIWEメッセージを生成します。
実装例
サーバー & フロントエンド
サーバーサイド検証
// Node.js / TypeScript サーバーサイド検証例
import { verifyMessage, hashMessage } from 'viem';
async function verifySiweSignature(message: string, signature: string) {
// 1. メッセージをパース
const parsed = parseSiweMessage(message);
// 2. 署名を検証
const isValid = await verifyMessage({
address: parsed.address,
message: message,
signature: signature,
});
// 3. 追加検証
if (!isValid) throw new Error('Invalid signature');
if (new Date(parsed.expirationTime) < new Date()) throw new Error('Expired');
if (!validateNonce(parsed.nonce)) throw new Error('Invalid nonce');
// 4. セッション発行
return createSession(parsed.address, parsed.chainId);
}フロントエンド実装
// React / wagmi フロントエンド例
import { useSignMessage } from 'wagmi';
function LoginButton() {
const { signMessageAsync } = useSignMessage();
const handleLogin = async () => {
// 1. サーバーからnonce取得
const { nonce } = await fetch('/api/auth/nonce').then(r => r.json());
// 2. SIWEメッセージ生成
const message = buildSiweMessage({
domain: window.location.host,
address: userAddress,
statement: 'Sign in to MyApp',
uri: window.location.origin,
version: '1',
chainId: chainId,
nonce: nonce,
issuedAt: new Date().toISOString(),
});
// 3. 署名
const signature = await signMessageAsync({ message });
// 4. サーバーに送信
await fetch('/api/auth/verify', {
method: 'POST',
body: JSON.stringify({ message, signature }),
});
};
return <button onClick={handleLogin}>Sign In with Ethereum</button>;
}📚 セキュリティのベストプラクティス
- • Nonce: サーバーで生成し、使用済みはDBに保存してリプレイを防ぐ
- • 有効期限: 短めに設定(5-15分推奨)
- • Domain/URI: サーバー側で期待値と照合
- • ChainID: 対応チェーン以外は拒否
- • Statement: 利用規約同意などの法的文言を含める
