Skip to content

تكامل البلوكشين

يتيح تكامل البلوكشين في SirrChat المصادقة بدون كلمة مرور باستخدام توقيعات محفظة EVM. يلغي هذا النهج المبتكر نقاط الضعف التقليدية في كلمات المرور مع توفير التحكم في الوصول الآمن تشفيريًا.

نظرة عامة

تتيح وحدة مصادقة البلوكشين (auth.pass_blockchain) للمستخدمين المصادقة باستخدام توقيعات محفظة Ethereum (أو متوافقة مع EVM) بدلاً من كلمات المرور التقليدية.

كيف يعمل

  1. تسجيل المستخدم: يتم تسجيل عنوان محفظة المستخدم مع حساب البريد الإلكتروني
  2. طلب المصادقة: يوقع العميل رسالة تحدي بمفتاحه الخاص
  3. التحقق من التوقيع: يستعيد الخادم المفتاح العام من التوقيع
  4. منح الوصول: إذا تطابق العنوان المستعاد مع العنوان المسجل، يتم منح الوصول

التكوين

الإعداد الأساسي

أضف مصادقة البلوكشين إلى sirrchatd.conf الخاص بك:

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 Mainnet1الإنتاج
Ethereum Goerli5شبكة الاختبار
Ethereum Sepolia11155111شبكة الاختبار
BSC Mainnet56الإنتاج
BSC Testnet97شبكة الاختبار
Polygon Mainnet137الإنتاج
Polygon Mumbai80001شبكة الاختبار
Arbitrum One42161الإنتاج
Optimism10الإنتاج

تدفق المصادقة

1. إنشاء التحدي

عندما يحاول مستخدم المصادقة، ينشئ الخادم رسالة تحدي:

Challenge: <random_nonce>
Timestamp: <unix_timestamp>
Service: sirrchat

2. التوقيع من جانب العميل

يوقع العميل التحدي باستخدام محفظة Ethereum الخاصة به:

javascript
// مثال باستخدام ethers.js
const message = `Challenge: ${nonce}\nTimestamp: ${timestamp}\nService: sirrchat`;
const signature = await wallet.signMessage(message);

3. التحقق من جانب الخادم

يتحقق الخادم من التوقيع ويستعيد العنوان:

go
// عملية التحقق الداخلية
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
}

إدارة المستخدمين

تسجيل مستخدم البلوكشين

bash
# تسجيل عنوان محفظة مع حساب بريد إلكتروني
sirrchatd creds create-blockchain \
    --email [email protected] \
    --address 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb

# قائمة مستخدمي البلوكشين
sirrchatd creds list-blockchain

تحديث عنوان المحفظة

bash
# تحديث عنوان المحفظة لحساب موجود
sirrchatd creds update-blockchain \
    --email [email protected] \
    --address 0xNewAddress

إزالة مصادقة البلوكشين

bash
# إزالة مصادقة البلوكشين (الاحتفاظ بحساب البريد الإلكتروني)
sirrchatd creds remove-blockchain --email [email protected]

تطبيق العميل

تكوين عميل البريد الإلكتروني

قم بتكوين عميل البريد الإلكتروني الخاص بك لاستخدام مصادقة البلوكشين:

إعدادات IMAP:

  • الخادم: your-domain.com
  • المنفذ: 993
  • الأمان: SSL/TLS
  • اسم المستخدم: [email protected]
  • كلمة المرور: <signature> (توقيع المحفظة)

مثال عميل مخصص

إليك مثال بسيط لتطبيق مصادقة البلوكشين في عميل مخصص:

javascript
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: `[email protected]`,
            password: signature,
            address: this.address
        };
    }

    async connectIMAP(host, port) {
        // الحصول على التحدي من الخادم
        const { challenge, timestamp } = await this.getChallengeFromServer();

        // إنشاء بيانات الاعتماد
        const creds = await this.generateAuthCredentials(challenge, timestamp);

        // الاتصال بخادم IMAP
        // ... استخدام creds للمصادقة
    }
}

اعتبارات الأمان

أفضل الممارسات

  1. لا تشارك المفاتيح الخاصة أبدًا: يجب عدم نقل المفاتيح الخاصة أو تخزينها على الخادم
  2. استخدم محافظ الأجهزة: للاستخدام الإنتاجي، ضع في اعتبارك تكامل محفظة الأجهزة
  3. تنفيذ انتهاء صلاحية Nonce: يجب أن تنتهي صلاحية تحديات nonces بعد فترة قصيرة
  4. تحديد المعدل: تنفيذ تحديد المعدل على محاولات المصادقة
  5. تسجيل التدقيق: تسجيل جميع محاولات المصادقة لمراقبة الأمان

منع هجوم إعادة التشغيل

يتضمن الخادم حماية ضد إعادة التشغيل:

conf
auth.pass_blockchain blockchain_auth {
    blockchain &sirrchatd
    storage &local_mailboxes

    # تكوين التحدي
    challenge_expiry 300s  # 5 دقائق
    nonce_cache_size 10000
}

المزايا على المصادقة التقليدية

فوائد الأمان

  • لا تخزين لكلمة المرور: يلغي اختراقات قاعدة بيانات كلمات المرور
  • التحقق التشفيري: يستند إلى تشفير منحنى إهليلجي مثبت
  • لا إعادة استخدام لكلمة المرور: كل توقيع فريد
  • مقاومة للتصيد الاحتيالي: لا يمكن خداعه للكشف عن بيانات الاعتماد

تجربة المستخدم

  • لا إدارة لكلمة المرور: لا يحتاج المستخدمون إلى تذكر كلمات المرور
  • متعدد الأجهزة: يمكن استخدام نفس المحفظة عبر جميع الأجهزة
  • خيارات الاسترداد: استخدام آليات استرداد المحفظة بدلاً من إعادة تعيين كلمة المرور

التكامل مع تطبيقات Web3

تكامل DApp

دمج وظائف البريد الإلكتروني في DApp الخاص بك:

javascript
// مثال: إرسال بريد إلكتروني من 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: '[email protected]',
        subject: 'Hello from DApp',
        body: 'This email was sent using blockchain authentication!'
    });
}

استكشاف الأخطاء وإصلاحها

المشاكل الشائعة

فشل التحقق من التوقيع

bash
# تحقق مما إذا كان العنوان مسجلاً
sirrchatd creds list-blockchain | grep [email protected]

# التحقق من تنسيق التحدي
# تأكد من أن العميل والخادم يستخدمان نفس تنسيق الرسالة

مشاكل اتصال RPC

bash
# اختبار نقطة نهاية 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}'

التكوين المتقدم

دعم السلاسل المتعددة

conf
# دعم سلاسل متعددة
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 &eth_mainnet &bsc_mainnet
    storage &local_mailboxes
}

منطق التحقق المخصص

توسيع وحدة البلوكشين للتحقق المخصص:

go
// تطبيق التحقق المخصص
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

الواجهة الأساسية

go
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)
}

الموارد


تلغي مصادقة البلوكشين كلمات المرور مع تعزيز الأمان من خلال التحقق التشفيري.

Released under the GPL 3.0 License.