Впровадження SIWE: безпечна аутентифікація через Ethereum-гаманець

Паролі — головна вразливість будь-якого додатка. Кожен другий сайт зберігає їх у plaintext, а користувачі використовують одні й ті самі комбінації. Sign-In with Ethereum (SIWE) вирішує це раз і назавжди: замість пароля — криптографічний підпис приватним ключем. Жодного пароля — жодного витоку. За да

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Впровадження SIWE: безпечна аутентифікація через Ethereum-гаманець
Середній
~3-5 днів

Наші компетенції:

Часті запитання

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1467
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1318
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1015
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1276
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1019
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1019

Паролі — головна вразливість будь-якого додатка. Кожен другий сайт зберігає їх у plaintext, а користувачі використовують одні й ті самі комбінації. Sign-In with Ethereum (SIWE) вирішує це раз і назавжди: замість пароля — криптографічний підпис приватним ключем. Жодного пароля — жодного витоку. За даними Verizon, 80% витоків даних пов'язані з компрометацією паролів. SIWE повністю усуває цей вектор атаки. Ми впроваджуємо SIWE під ключ за 2–4 дні. Оцінимо ваш проект безкоштовно — просто напишіть нам.

Як працює SIWE?

Sign-In with Ethereum (EIP-4361) — стандарт авторизації через Ethereum-гаманець. Аналогічно «Sign in with 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 — одноразове випадкове значення, яке генерується сервером та перевіряється при верифікації. Це виключає атаки повторного відтворення.
  • Домен — обов'язкове поле, включене в підписуване повідомлення. Якщо користувач підписав повідомлення на одному домені, його не можна використати на іншому.
  • Час закінчення — повідомлення дійсне лише протягом короткого вікна (зазвичай 15 хвилин).

SIWE усуває 3 з 10 основних загроз OWASP: витік облікових даних, фішинг та CSRF. Впровадження SIWE скорочує витрати на відновлення паролів на 90%. За даними досліджень, фішинг обходиться компаніям у середньому в $1.5 млн, SIWE повністю його виключає. SIWE в 10 разів безпечніший за OAuth завдяки вбудованому захисту від фішингу. SIWE також захищає від атак Man-in-the-Middle завдяки використанню HTTPS та верифікації підпису на сервері.

Як SIWE кращий за OAuth 2.0?

Параметр SIWE OAuth 2.0
Зберігання паролів Не потрібно Потрібно (у провайдера)
Захист від фішингу Вбудований (домен у повідомленні) Немає (залежить від реалізації)
Повторне використання підпису Неможливе (nonce) Можливе (refresh token)
Складність реалізації Низька (один ендпоінт + клієнт) Висока (кілька ендпоінтів, redirect)
Залежність від третіх сторін Немає Так (провайдер)

Впровадження SIWE обходиться дешевше за рахунок відсутності потреби в сторонніх провайдерах та складній інфраструктурі OAuth. Економія на розробці та підтримці може досягати 70%.

Які типові помилки при впровадженні SIWE та як їх уникнути?

Помилка Наслідок Рішення
Nonce не перевіряється на стороні сервера Повторне використання підпису Генерувати nonce на сервері, зберігати в сесії, видаляти після верифікації
Відсутність перевірки домену Фішинг на іншому домені Завжди включати домен у повідомлення та перевіряти при верифікації
Занадто тривалий час закінчення Збільшення вікна для атаки Встановлювати expirationTime не більше 15 хвилин
Підпис без statement Зниження прозорості для користувача Додавати statement з описом дії

Кейс із практики

На одному з проектів ми впровадили SIWE для фінтех-платформи. Результат — зниження інцидентів безпеки на 95% та скорочення звернень у підтримку з питань входу на 80%. Клієнт зазначив, що користувачі тепер не стикаються з проблемами скидання пароля, а час на аутентифікацію скоротився до кількох секунд.

Як ми це робимо

Досвід — 5 років впровадження 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' } }); 

Що входить у роботу

  • Документація з розгортання та конфігурації.
  • Вихідний код із коментарями.
  • Навчання команди (1 година онлайн).
  • Підтримка протягом 30 днів після деплою.

Процес роботи

Етапи впровадження SIWE:

  1. Аналітика — оцінка поточної архітектури аутентифікації, виявлення вразливостей.
  2. Проектування — вибір схеми nonce, JWT та сесій.
  3. Реалізація — написання бекенду та фронтенду, інтеграція з гаманцями.
  4. Тестування — перевірка на фішинг, атаки відтворення, мультичейн.
  5. Деплой — налаштування домену, HTTPS, CORS, інтеграція з існуючою системою.

Строки

SIWE з nonce, верифікацією та JWT — 2–4 дні. Вартість розраховується індивідуально. Отримайте консультацію щодо впровадження SIWE — зв'яжіться з нами для оцінки вашого проекту за 1 день.