تكامل البلوكشين
يتيح تكامل البلوكشين في SirrChat المصادقة بدون كلمة مرور باستخدام توقيعات محفظة EVM. يلغي هذا النهج المبتكر نقاط الضعف التقليدية في كلمات المرور مع توفير التحكم في الوصول الآمن تشفيريًا.
نظرة عامة
تتيح وحدة مصادقة البلوكشين (auth.pass_blockchain) للمستخدمين المصادقة باستخدام توقيعات محفظة Ethereum (أو متوافقة مع EVM) بدلاً من كلمات المرور التقليدية.
كيف يعمل
- تسجيل المستخدم: يتم تسجيل عنوان محفظة المستخدم مع حساب البريد الإلكتروني
- طلب المصادقة: يوقع العميل رسالة تحدي بمفتاحه الخاص
- التحقق من التوقيع: يستعيد الخادم المفتاح العام من التوقيع
- منح الوصول: إذا تطابق العنوان المستعاد مع العنوان المسجل، يتم منح الوصول
التكوين
الإعداد الأساسي
أضف مصادقة البلوكشين إلى sirrchatd.conf الخاص بك:
# تكوين البلوكشين
blockchain sirrchatd {
rpc_endpoint https://mainnet.infura.io/v3/YOUR_PROJECT_ID
chain_id 1 # Ethereum Mainnet
}
# وحدة المصادقة
auth.pass_blockchain blockchain_auth {
blockchain &sirrchatd
storage &local_mailboxes
}
# استخدم في نقطة نهاية IMAP
imap tls://0.0.0.0:993 {
auth &blockchain_auth
storage &local_mailboxes
}السلاسل المدعومة
يدعم SirrChat أي بلوكشين متوافق مع EVM:
| السلسلة | معرف السلسلة | الشبكة |
|---|---|---|
| Ethereum Mainnet | 1 | الإنتاج |
| Ethereum Goerli | 5 | شبكة الاختبار |
| Ethereum Sepolia | 11155111 | شبكة الاختبار |
| BSC Mainnet | 56 | الإنتاج |
| BSC Testnet | 97 | شبكة الاختبار |
| Polygon Mainnet | 137 | الإنتاج |
| Polygon Mumbai | 80001 | شبكة الاختبار |
| Arbitrum One | 42161 | الإنتاج |
| Optimism | 10 | الإنتاج |
تدفق المصادقة
1. إنشاء التحدي
عندما يحاول مستخدم المصادقة، ينشئ الخادم رسالة تحدي:
Challenge: <random_nonce>
Timestamp: <unix_timestamp>
Service: sirrchat2. التوقيع من جانب العميل
يوقع العميل التحدي باستخدام محفظة Ethereum الخاصة به:
// مثال باستخدام ethers.js
const message = `Challenge: ${nonce}\nTimestamp: ${timestamp}\nService: sirrchat`;
const signature = await wallet.signMessage(message);3. التحقق من جانب الخادم
يتحقق الخادم من التوقيع ويستعيد العنوان:
// عملية التحقق الداخلية
func (bc *Ethereum) CheckSign(ctx context.Context, pk, sign, message string) (bool, error) {
hash := crypto.Keccak256Hash([]byte(message))
signature := hexutil.MustDecode(sign)
// استعادة المفتاح العام من التوقيع
pubKey, err := crypto.SigToPub(hash.Bytes(), signature)
if err != nil {
return false, err
}
// الحصول على العنوان من المفتاح العام
recoveredAddr := crypto.PubkeyToAddress(*pubKey)
// المقارنة مع العنوان المسجل
return recoveredAddr.Hex() == pk, nil
}إدارة المستخدمين
تسجيل مستخدم البلوكشين
# تسجيل عنوان محفظة مع حساب بريد إلكتروني
sirrchatd creds create-blockchain \
--email user@example.com \
--address 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb
# قائمة مستخدمي البلوكشين
sirrchatd creds list-blockchainتحديث عنوان المحفظة
# تحديث عنوان المحفظة لحساب موجود
sirrchatd creds update-blockchain \
--email user@example.com \
--address 0xNewAddressإزالة مصادقة البلوكشين
# إزالة مصادقة البلوكشين (الاحتفاظ بحساب البريد الإلكتروني)
sirrchatd creds remove-blockchain --email user@example.comتطبيق العميل
تكوين عميل البريد الإلكتروني
قم بتكوين عميل البريد الإلكتروني الخاص بك لاستخدام مصادقة البلوكشين:
إعدادات IMAP:
- الخادم: your-domain.com
- المنفذ: 993
- الأمان: SSL/TLS
- اسم المستخدم: user@example.com
- كلمة المرور:
<signature>(توقيع المحفظة)
مثال عميل مخصص
إليك مثال بسيط لتطبيق مصادقة البلوكشين في عميل مخصص:
const ethers = require('ethers');
class BlockchainEmailAuth {
constructor(walletAddress, privateKey) {
this.wallet = new ethers.Wallet(privateKey);
this.address = walletAddress;
}
async generateAuthCredentials(challenge, timestamp) {
const message = `Challenge: ${challenge}\nTimestamp: ${timestamp}\nService: sirrchat`;
const signature = await this.wallet.signMessage(message);
return {
username: `user@example.com`,
password: signature,
address: this.address
};
}
async connectIMAP(host, port) {
// الحصول على التحدي من الخادم
const { challenge, timestamp } = await this.getChallengeFromServer();
// إنشاء بيانات الاعتماد
const creds = await this.generateAuthCredentials(challenge, timestamp);
// الاتصال بخادم IMAP
// ... استخدام creds للمصادقة
}
}اعتبارات الأمان
أفضل الممارسات
- لا تشارك المفاتيح الخاصة أبدًا: يجب عدم نقل المفاتيح الخاصة أو تخزينها على الخادم
- استخدم محافظ الأجهزة: للاستخدام الإنتاجي، ضع في اعتبارك تكامل محفظة الأجهزة
- تنفيذ انتهاء صلاحية Nonce: يجب أن تنتهي صلاحية تحديات nonces بعد فترة قصيرة
- تحديد المعدل: تنفيذ تحديد المعدل على محاولات المصادقة
- تسجيل التدقيق: تسجيل جميع محاولات المصادقة لمراقبة الأمان
منع هجوم إعادة التشغيل
يتضمن الخادم حماية ضد إعادة التشغيل:
auth.pass_blockchain blockchain_auth {
blockchain &sirrchatd
storage &local_mailboxes
# تكوين التحدي
challenge_expiry 300s # 5 دقائق
nonce_cache_size 10000
}المزايا على المصادقة التقليدية
فوائد الأمان
- لا تخزين لكلمة المرور: يلغي اختراقات قاعدة بيانات كلمات المرور
- التحقق التشفيري: يستند إلى تشفير منحنى إهليلجي مثبت
- لا إعادة استخدام لكلمة المرور: كل توقيع فريد
- مقاومة للتصيد الاحتيالي: لا يمكن خداعه للكشف عن بيانات الاعتماد
تجربة المستخدم
- لا إدارة لكلمة المرور: لا يحتاج المستخدمون إلى تذكر كلمات المرور
- متعدد الأجهزة: يمكن استخدام نفس المحفظة عبر جميع الأجهزة
- خيارات الاسترداد: استخدام آليات استرداد المحفظة بدلاً من إعادة تعيين كلمة المرور
التكامل مع تطبيقات Web3
تكامل DApp
دمج وظائف البريد الإلكتروني في DApp الخاص بك:
// مثال: إرسال بريد إلكتروني من DApp
async function sendEmailFromDApp(web3Provider) {
const signer = web3Provider.getSigner();
const address = await signer.getAddress();
// الحصول على التحدي
const challenge = await fetchChallenge();
// توقيع التحدي
const signature = await signer.signMessage(challenge.message);
// المصادقة وإرسال البريد الإلكتروني
await sendEmail({
from: `${address}@yourdomain.com`,
signature: signature,
to: 'recipient@example.com',
subject: 'Hello from DApp',
body: 'This email was sent using blockchain authentication!'
});
}استكشاف الأخطاء وإصلاحها
المشاكل الشائعة
فشل التحقق من التوقيع
# تحقق مما إذا كان العنوان مسجلاً
sirrchatd creds list-blockchain | grep user@example.com
# التحقق من تنسيق التحدي
# تأكد من أن العميل والخادم يستخدمان نفس تنسيق الرسالةمشاكل اتصال RPC
# اختبار نقطة نهاية RPC
curl -X POST https://mainnet.infura.io/v3/YOUR_PROJECT_ID \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'التكوين المتقدم
دعم السلاسل المتعددة
# دعم سلاسل متعددة
blockchain eth_mainnet {
rpc_endpoint https://mainnet.infura.io/v3/YOUR_PROJECT_ID
chain_id 1
}
blockchain bsc_mainnet {
rpc_endpoint https://bsc-dataseed1.binance.org
chain_id 56
}
auth.pass_blockchain multi_chain_auth {
blockchain ð_mainnet &bsc_mainnet
storage &local_mailboxes
}منطق التحقق المخصص
توسيع وحدة البلوكشين للتحقق المخصص:
// تطبيق التحقق المخصص
type CustomBlockchainAuth struct {
baseAuth *blockchain.Ethereum
}
func (c *CustomBlockchainAuth) VerifyWithNFT(ctx context.Context, address, signature string) (bool, error) {
// التحقق من التوقيع
valid, err := c.baseAuth.CheckSign(ctx, address, signature, message)
if err != nil || !valid {
return false, err
}
// فحص ملكية NFT إضافي
hasNFT, err := c.checkNFTOwnership(ctx, address)
return hasNFT, err
}مرجع API
الواجهة الأساسية
type BlockChain interface {
// إرسال معاملة خام إلى البلوكشين
SendRawTx(ctx context.Context, rawTx string) error
// الحصول على نوع البلوكشين
ChainType(ctx context.Context) string
// التحقق من التوقيع والتحقق مما إذا كان يطابق المفتاح العام
CheckSign(ctx context.Context, pk, sign, message string) (bool, error)
}الموارد
تلغي مصادقة البلوكشين كلمات المرور مع تعزيز الأمان من خلال التحقق التشفيري.