סיסמאות נותרות נקודת התורפה העיקרית בכל יישום. יותר מדי אתרים עדיין מאחסנים אותן בטקסט פשוט, ומשתמשים עושים שימוש חוזר באותם פרטי כניסה בין שירותים. כניסה עם Ethereum (SIWE) מבטלת את וקטור התקיפה הזה לצמיתות: במקום סיסמה, האימות מסתמך על חתימה קריפטוגרפית ממפתח פרטי. ללא סיסמה, אין דליפה. לפי Verizon, 80% מפרצות הנתונים כוללות סיסמאות שנפגעו. SIWE מסירה לחלוטין את הסיכון הזה. אנו מיישמים SIWE מקצה לקצה תוך 2–4 ימים. כדי להעריך את הפרויקט שלך, פשוט צור קשר—נספק הערכה חינם.
כיצד פועל SIWE
כניסה עם Ethereum (EIP-4361) הוא תקן לאימות באמצעות ארנק Ethereum. בדומה ל"כניסה עם Google," אך במקום OAuth, הוא משתמש בחתימה על הודעה מובנית עם מפתח פרטי. התקן מגדיר פורמט הודעה מדויק שהמשתמש חותם עליו. ההודעה כוללת את הדומיין, כתובת הארנק, nonce, וזמן תפוגה. השרת מאמת את החתימה ומנפיק JWT. למפרט המלא, ראה EIP-4361.
example.com wants you to sign in with your Ethereum account: 0x742d35Cc6634C0532925a3b844Bc454e4438f44e Sign in to Example App URI: https://example.com Version: 1 Chain ID: 1 Nonce: oBbLoEldZs Issued At: 2024-01-01T10:00:00.000Z Expiration Time: 2024-01-01T10:15:00.000Z תהליך זה מבטיח שהחתימה תקפה רק עבור הדומיין המיועד ו-nonce חד-פעמי, ומונע שימוש חוזר באתרים אחרים.
מה הופך את SIWE למאובטח?
- Nonce — ערך אקראי חד-פעמי שנוצר על ידי השרת ומאומת במהלך אימות החתימה. זה מונע התקפות replay.
- דומיין — שדה חובה הנכלל בהודעה החתומה. חתימה מדומיין אחד לא יכולה לשמש באחר.
- זמן תפוגה — ההודעה תקפה רק לחלון זמן קצר (בדרך כלל 15 דקות).
SIWE ממתן 3 מתוך 10 האיומים המובילים של OWASP: גניבת אישורים, פישינג, ו-CSRF. יישום SIWE יכול להפחית עלויות איפוס סיסמה ב-90%. פישינג לבדו עולה לחברות בממוצע 1.5 מיליון דולר בשנה; SIWE מבטל אותו לחלוטין. SIWE מאובטח פי 10 מ-OAuth בשל הגנת הפישינג המובנית. הוא גם מגן מפני התקפות Man-in-the-Middle באמצעות HTTPS ואימות חתימה בצד השרת.
כיצד SIWE משתווה ל-OAuth 2.0
| פרמטר | SIWE | OAuth 2.0 |
|---|---|---|
| אחסון סיסמאות | לא נדרש | נדרש (אצל הספק) |
| הגנת פישינג | מובנית (דומיין בהודעה) | אין (תלוי ביישום) |
| שימוש חוזר בחתימה | בלתי אפשרי (nonce) | אפשרי (refresh token) |
| מורכבות יישום | נמוכה (endpoint אחד + לקוח) | גבוהה (multiple endpoints, הפניה) |
| תלות בצד שלישי | אין | כן (ספק) |
יישום SIWE זול יותר כי הוא מבטל את הצורך בספקי צד שלישי ובתשתית OAuth מורכבת. החיסכון בפיתוח ותחזוקה יכול להגיע ל-70%.
טעויות נפוצות ביישום SIWE וכיצד להימנע מהן
| טעות | השלכה | פתרון |
|---|---|---|
| Nonce לא מאומת בצד השרת | שימוש חוזר בחתימה | צור nonce בשרת, אחסן ב-session, מחק לאחר אימות |
| חוסר בדיקת דומיין | פישינג בדומיין אחר | כלול תמיד דומיין בהודעה ואמת במהלך האימות |
| זמן תפוגה מופרז | חלון תקיפה רחב יותר | הגדר expirationTime ללא יותר מ-15 דקות |
| חתימה ללא הצהרה | שקיפות מופחתת למשתמש | הוסף הצהרה המתארת את הפעולה |
מקרה בוחן מהעולם האמיתי
בפלטפורמת fintech, יישמנו SIWE כדי להחליף אימות מבוסס סיסמה. התוצאות: הפחתה של 95% בתקריות אבטחה וירידה של 80% בכרטוסי תמיכה הקשורים לבעיות התחברות. לקוחות דיווחו שמשתמשים כבר לא נתקלים בבעיות איפוס סיסמה, וזמן האימות ירד לכמה שניות.
הגישה שלנו
לצוות שלנו ניסיון רב בפתרונות Web3, עם למעלה מ-20 פרויקטים הכוללים אימות מבוסס Ethereum. אנו משתמשים בגרסאות עדכניות של הסטאק: ethers v6, siwe v2, Next.js 14. אנו מבטיחים פעולה יציבה ואימות ללא שגיאות.
קוד לקוח (React/Next.js)
import { SiweMessage } from 'siwe'; import { ethers } from 'ethers'; async function signInWithEthereum() { const provider = new ethers.BrowserProvider(window.ethereum); await provider.send('eth_requestAccounts', []); const signer = await provider.getSigner(); const address = await signer.getAddress(); const chainId = (await provider.getNetwork()).chainId; const nonce = await fetch('/api/siwe/nonce').then(r => r.text()); const message = new SiweMessage({ domain: window.location.host, address, statement: 'Войти в Example App', uri: window.location.origin, version: '1', chainId: Number(chainId), nonce, issuedAt: new Date().toISOString(), expirationTime: new Date(Date.now() + 15 * 60 * 1000).toISOString() }); const signature = await signer.signMessage(message.prepareMessage()); const response = await fetch('/api/siwe/verify', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message: message.prepareMessage(), signature }) }); const { token } = await response.json(); return token; } קוד שרת (Node.js/Express)
import { SiweMessage } from 'siwe'; app.get('/api/siwe/nonce', (req, res) => { const nonce = generateNonce(); req.session.nonce = nonce; res.send(nonce); }); app.post('/api/siwe/verify', async (req, res) => { const { message, signature } = req.body; try { const siweMessage = new SiweMessage(message); const { data: fields } = await siweMessage.verify({ signature, nonce: req.session.nonce, domain: 'example.com', time: new Date().toISOString() }); req.session.nonce = null; const user = await userRepo.findOrCreateByAddress(fields.address.toLowerCase()); const token = jwt.sign( { sub: user.id, address: fields.address, chainId: fields.chainId }, process.env.JWT_SECRET, { expiresIn: '7d' } ); res.json({ token, address: fields.address }); } catch (error) { if (error.type === SiweErrorType.EXPIRED_MESSAGE) { return res.status(401).json({ error: 'Message expired, please try again' }); } if (error.type === SiweErrorType.INVALID_SIGNATURE) { return res.status(401).json({ error: 'Invalid signature' }); } if (error.type === SiweErrorType.DOMAIN_MISMATCH) { return res.status(401).json({ error: 'Domain mismatch' }); } res.status(500).json({ error: 'Verification failed' }); } }); שילוב SIWE עם NextAuth
// pages/api/auth/[...nextauth].ts import { SiweMessage } from 'siwe'; import NextAuth from 'next-auth'; import CredentialsProvider from 'next-auth/providers/credentials'; export default NextAuth({ providers: [ CredentialsProvider({ name: 'Ethereum', credentials: { message: { label: 'Message', type: 'text' }, signature: { label: 'Signature', type: 'text' } }, async authorize(credentials) { const siwe = new SiweMessage(credentials.message); const result = await siwe.verify({ signature: credentials.signature, domain: process.env.NEXTAUTH_URL }); if (result.success) { return { id: result.data.address }; } return null; } }) ], session: { strategy: 'jwt' } }); מה כלול
- תיעוד פריסה והגדרה.
- קוד מקור עם הערות.
- הדרכת צוות (שעה אונליין).
- תמיכה ל-30 יום לאחר הפריסה.
תהליך עבודה
- הערכה — הערכת ארכיטקטורת האימות הנוכחית, זיהוי נקודות תורפה.
- עיצוב — בחירת סכמת nonce, JWT, ואסטרטגיית session.
- יישום — בניית backend ו-frontend, שילוב עם ארנקים.
- בדיקות — אימות נגד פישינג, התקפות replay, תרחישי multichain.
- פריסה — הגדרת דומיין, HTTPS, CORS, שילוב עם המערכת הקיימת.
לוחות זמנים
SIWE עם nonce, אימות, ו-JWT: 2–4 ימים. העלות נקבעת לאחר ניתוח. צור קשר לייעוץ להערכת שילוב SIWE שלך—נעריך את הפרויקט שלך תוך יום עסקים אחד.







