[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-building-biometric-verification-systems-indonesia-architecture-rust-ar":3},{"article":4,"author":53},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":7,"meta_description":9,"focus_keyword":16,"og_image":17,"canonical_url":17,"robots_meta":18,"created_at":15,"updated_at":15,"tags":19,"category_name":27,"related_articles":33},"d0000000-0000-0000-0000-000000000545","a0000000-0000-0000-0000-000000000003","بناء أنظمة التحقق البيومتري لإندونيسيا: البنية وأنماط Rust","building-biometric-verification-systems-indonesia-architecture-rust-ar","دليل تقني معمق لبناء أنظمة التحقق البيومتري لتفويض KOMDIGI SIM في إندونيسيا. مكونات النظام، الامتثال لـ UU PDP، أنماط قابلية التوسع، تشفير AES-256 وأمثلة كود Rust.","## بناء الخادم الخلفي للتحقق البيومتري من SIM في إندونيسيا\n\nهذا المقال هو الجزء الثالث من سلسلة تفويض التحقق البيومتري لبطاقات SIM في إندونيسيا، ويركز على القرارات المعمارية العملية وتنفيذ الكود اللازم لبناء **نظام تحقق بيومتري بمستوى الإنتاج**. سنتعمق في تصميم النظام وتدفقات البيانات وممارسات التشفير والخدمات الخلفية القابلة للتوسع المبنية بـ Rust وAxum.\n\n## نظرة عامة على بنية النظام\n\nيتكون نظام التحقق البيومتري بمستوى الإنتاج من عدة مكونات مترابطة، لكل منها مسؤوليات محددة:\n\n### المكونات الأساسية\n\n1. **خدمة الالتقاط (SDK للهاتف\u002Fالويب)** — مكون الواجهة الأمامية الذي يتعامل مع التقاط صورة الوجه وكشف الحيوية على الجهاز\n2. **بوابة API** — إدارة مركزية للمصادقة وتحديد معدل الطلبات وتوجيه الطلبات وإنهاء TLS\n3. **محرك المعالجة البيومترية** — خدمة تستخرج قوالب السمات البيومترية من صور الوجه\n4. **خدمة كشف الحيوية** — تشغل نماذج كشف الحيوية السلبية والنشطة\n5. **خدمة التكامل مع IKD** — تتعامل مع اتصالات التحقق 1:1 مع منصة IKD الإندونيسية\n6. **خدمة التشفير** — إدارة مفاتيح AES-256، تشفير\u002Fفك تشفير القوالب\n7. **خدمة سجل التدقيق** — تسجل جميع معاملات التحقق للامتثال التنظيمي\n8. **المراقبة والتنبيهات** — صحة النظام ومقاييس الأداء وكشف الشذوذ\n\n### بنية تدفق البيانات\n\n```\nSDK العميل → بوابة API → المحرك البيومتري → منصة IKD\n                ↓              ↓            ↓\n        تحديد المعدل    خدمة التشفير    سجل التدقيق\n                ↓              ↓            ↓\n        ذاكرة المصادقة  إدارة المفاتيح  تخزين الامتثال\n```\n\n## تنفيذ الخادم الخلفي بـ Rust\n\n### هيكل المشروع\n\n```\nbiometric-service\u002F\n├── Cargo.toml\n├── src\u002F\n│   ├── main.rs              # نقطة الدخول وإعداد الخادم\n│   ├── config.rs            # إدارة التكوين\n│   ├── routes\u002F\n│   │   ├── mod.rs\n│   │   ├── verify.rs        # نقاط نهاية التحقق\n│   │   ├── health.rs        # فحص الصحة\n│   │   └── admin.rs         # نقاط نهاية الإدارة\n│   ├── services\u002F\n│   │   ├── mod.rs\n│   │   ├── biometric.rs     # المعالجة البيومترية\n│   │   ├── liveness.rs      # كشف الحيوية\n│   │   ├── ikd.rs           # عميل منصة IKD\n│   │   ├── crypto.rs        # عمليات التشفير\n│   │   └── audit.rs         # سجل التدقيق\n│   ├── models\u002F\n│   ├── middleware\u002F\n│   └── errors.rs\n├── migrations\u002F\n└── tests\u002F\n```\n\n### نقطة نهاية التحقق الأساسية\n\n```rust\nuse axum::{extract::State, Json};\nuse chrono::Utc;\nuse uuid::Uuid;\n\n\u002F\u002F\u002F نقطة نهاية التحقق الرئيسية — تتعامل مع تدفق التحقق البيومتري الكامل\npub async fn verify_biometric(\n    State(state): State\u003CAppState>,\n    Json(req): Json\u003CVerificationRequest>,\n) -> Result\u003CJson\u003CVerificationResponse>, AppError> {\n    let transaction_id = Uuid::new_v4();\n    let started_at = Utc::now();\n\n    \u002F\u002F 1. التحقق من الطلب\n    req.validate()?;\n\n    \u002F\u002F 2. كشف الحيوية\n    let liveness = state.liveness_service\n        .detect(&req.capture_data)\n        .await\n        .map_err(|e| {\n            state.audit.log_failure(\n                transaction_id, \"liveness_failed\", &e\n            );\n            e\n        })?;\n\n    if !liveness.is_live {\n        return Err(AppError::LivenessCheckFailed);\n    }\n\n    \u002F\u002F 3. استخراج القالب البيومتري\n    let template = state.biometric_engine\n        .extract(&req.facial_image)\n        .await?;\n\n    \u002F\u002F 4. تشفير القالب للنقل\n    let encrypted = state.crypto_service\n        .encrypt_template(&template)\n        .await?;\n\n    \u002F\u002F 5. التحقق 1:1 مع IKD\n    let ikd_result = state.ikd_client\n        .verify(&req.nik, &encrypted)\n        .await?;\n\n    \u002F\u002F 6. تسجيل سجل التدقيق\n    let elapsed = Utc::now() - started_at;\n    state.audit.log_verification(AuditRecord {\n        transaction_id,\n        nik_hash: hash_nik(&req.nik),\n        liveness_score: liveness.confidence,\n        match_score: ikd_result.score,\n        verified: ikd_result.matched,\n        duration_ms: elapsed.num_milliseconds(),\n        timestamp: started_at,\n    }).await?;\n\n    Ok(Json(VerificationResponse {\n        transaction_id,\n        verified: ikd_result.matched,\n        confidence: ikd_result.score,\n    }))\n}\n```\n\n### خدمة تشفير AES-256\n\nوفقًا لمتطلبات UU PDP ولائحة KOMDIGI، يجب تشفير جميع القوالب البيومترية بـ AES-256:\n\n```rust\nuse aes_gcm::{Aes256Gcm, KeyInit, Nonce};\nuse aes_gcm::aead::Aead;\nuse rand::RngCore;\n\npub struct CryptoService {\n    cipher: Aes256Gcm,\n}\n\nimpl CryptoService {\n    pub fn new(key: &[u8; 32]) -> Self {\n        let cipher = Aes256Gcm::new_from_slice(key)\n            .expect(\"AES-256 key must be 32 bytes\");\n        Self { cipher }\n    }\n\n    pub async fn encrypt_template(\n        &self,\n        template: &BiometricTemplate,\n    ) -> Result\u003CEncryptedTemplate, CryptoError> {\n        let mut nonce_bytes = [0u8; 12];\n        rand::thread_rng().fill_bytes(&mut nonce_bytes);\n        let nonce = Nonce::from_slice(&nonce_bytes);\n\n        let plaintext = bincode::serialize(template)?;\n        let ciphertext = self.cipher\n            .encrypt(nonce, plaintext.as_ref())\n            .map_err(|_| CryptoError::EncryptionFailed)?;\n\n        Ok(EncryptedTemplate {\n            ciphertext,\n            nonce: nonce_bytes.to_vec(),\n            algorithm: \"AES-256-GCM\".into(),\n        })\n    }\n}\n```\n\n## قابلية التوسع والأداء\n\n### تحدي الحجم الإندونيسي\n\nمع أكثر من 270 مليون نسمة و345 مليون بطاقة SIM نشطة، فإن متطلبات التوسع لنظام التحقق البيومتري هائلة:\n\n- **تقدير حمل الذروة**: بافتراض 50 مليون تسجيل جديد في أول 6 أشهر، حوالي 278,000 عملية تحقق يوميًا في المتوسط\n- **ساعات الذروة**: بالنظر إلى أنماط ساعات العمل الإندونيسية، قد تكون الذروة 3-5 أضعاف المتوسط، أي 830,000 إلى 1,390,000 يوميًا\n- **الطلبات في الثانية**: ذروة تقريبية 16 TPS، مع الحاجة لهامش لحركة المرور المفاجئة\n\n### استراتيجية التوسع الأفقي\n\n```rust\n#[tokio::main]\nasync fn main() {\n    let config = Config::from_env();\n\n    let pool = PgPoolOptions::new()\n        .max_connections(config.db_max_connections)\n        .min_connections(config.db_min_connections)\n        .acquire_timeout(Duration::from_secs(3))\n        .connect(&config.database_url)\n        .await\n        .expect(\"Failed to create pool\");\n\n    let app = Router::new()\n        .route(\"\u002Fapi\u002Fv1\u002Fverify\", post(verify_biometric))\n        .route(\"\u002Fhealth\", get(health_check))\n        .layer(RateLimitLayer::new(config.rate_limit))\n        .layer(TimeoutLayer::new(Duration::from_secs(10)))\n        .with_state(AppState::new(pool, config));\n\n    let listener = TcpListener::bind(&config.bind_addr)\n        .await\n        .expect(\"Failed to bind\");\n\n    axum::serve(listener, app).await.unwrap();\n}\n```\n\n## تنفيذ الامتثال لـ UU PDP\n\n### سياسة الاحتفاظ بالبيانات\n\n```rust\n\u002F\u002F\u002F مهمة مجدولة: تنظيف سجلات التدقيق المنتهية\npub async fn cleanup_expired_records(\n    pool: &PgPool,\n) -> Result\u003Cu64, sqlx::Error> {\n    \u002F\u002F متطلب UU PDP: الاحتفاظ بسجلات التحقق لمدة 5 سنوات\n    let cutoff = Utc::now() - chrono::Duration::days(5 * 365);\n\n    let result = sqlx::query(\n        \"DELETE FROM audit_logs WHERE created_at \u003C $1\"\n    )\n    .bind(cutoff)\n    .execute(pool)\n    .await?;\n\n    Ok(result.rows_affected())\n}\n\n\u002F\u002F\u002F طلب حذف بيانات المستخدم (حق النسيان)\npub async fn handle_deletion_request(\n    pool: &PgPool,\n    nik_hash: &str,\n) -> Result\u003CDeletionReport, AppError> {\n    let mut tx = pool.begin().await?;\n\n    let templates_deleted = sqlx::query(\n        \"DELETE FROM biometric_templates WHERE nik_hash = $1\"\n    )\n    .bind(nik_hash)\n    .execute(&mut *tx)\n    .await?\n    .rows_affected();\n\n    let logs_anonymized = sqlx::query(\n        \"UPDATE audit_logs SET nik_hash = 'anonymized' WHERE nik_hash = $1\"\n    )\n    .bind(nik_hash)\n    .execute(&mut *tx)\n    .await?\n    .rows_affected();\n\n    tx.commit().await?;\n\n    Ok(DeletionReport {\n        templates_deleted,\n        logs_anonymized,\n        completed_at: Utc::now(),\n    })\n}\n```\n\n## توصيات النشر\n\n### مراكز البيانات في إندونيسيا\n\nوفقًا للائحة KOMDIGI ومتطلبات UU PDP، يجب أن تتم المعالجة البيومترية في مراكز بيانات في إندونيسيا. المواقع الموصى بها:\n\n- **الرئيسي**: جاكرتا (قرب من غالبية المستخدمين ومنصة IKD)\n- **التعافي من الكوارث**: سورابايا أو بالي (التكرار الجغرافي)\n- **CDN**: عقد حافة وطنية (لتوزيع SDK والموارد الثابتة)\n\n## الخلاصة\n\nبناء نظام تحقق بيومتري متوافق مع لائحة KOMDIGI في إندونيسيا هو تحدٍ هندسي معقد لكن قابل للإدارة. النقاط الرئيسية:\n\n1. **الأمان أولاً**: تشفير AES-256، نقل TLS 1.3، بنية عدم الثقة\n2. **مدفوع بالامتثال**: حماية بيانات UU PDP، الاحتفاظ بسجلات التدقيق لمدة 5 سنوات، حق حذف المستخدم\n3. **تصميم قابل للتوسع**: التوسع الأفقي، التخزين المؤقت متعدد المستويات، المعالجة غير المتزامنة\n4. **نشر محلي**: مراكز بيانات إندونيسية، تحسين عرض النطاق المنخفض، دعم تنوع الأجهزة\n5. **مراقبة شاملة**: مقاييس في الوقت الفعلي، كشف الشذوذ، تقارير الامتثال\n\nبناء هذا النظام بـ Rust وAxum يوفر ضمانات أداء وأمان ممتازة مع تلبية المتطلبات التنظيمية الصارمة في إندونيسيا.","\u003Ch2 id=\"sim\">بناء الخادم الخلفي للتحقق البيومتري من SIM في إندونيسيا\u003C\u002Fh2>\n\u003Cp>هذا المقال هو الجزء الثالث من سلسلة تفويض التحقق البيومتري لبطاقات SIM في إندونيسيا، ويركز على القرارات المعمارية العملية وتنفيذ الكود اللازم لبناء \u003Cstrong>نظام تحقق بيومتري بمستوى الإنتاج\u003C\u002Fstrong>. سنتعمق في تصميم النظام وتدفقات البيانات وممارسات التشفير والخدمات الخلفية القابلة للتوسع المبنية بـ Rust وAxum.\u003C\u002Fp>\n\u003Ch2 id=\"\">نظرة عامة على بنية النظام\u003C\u002Fh2>\n\u003Cp>يتكون نظام التحقق البيومتري بمستوى الإنتاج من عدة مكونات مترابطة، لكل منها مسؤوليات محددة:\u003C\u002Fp>\n\u003Ch3>المكونات الأساسية\u003C\u002Fh3>\n\u003Col>\n\u003Cli>\u003Cstrong>خدمة الالتقاط (SDK للهاتف\u002Fالويب)\u003C\u002Fstrong> — مكون الواجهة الأمامية الذي يتعامل مع التقاط صورة الوجه وكشف الحيوية على الجهاز\u003C\u002Fli>\n\u003Cli>\u003Cstrong>بوابة API\u003C\u002Fstrong> — إدارة مركزية للمصادقة وتحديد معدل الطلبات وتوجيه الطلبات وإنهاء TLS\u003C\u002Fli>\n\u003Cli>\u003Cstrong>محرك المعالجة البيومترية\u003C\u002Fstrong> — خدمة تستخرج قوالب السمات البيومترية من صور الوجه\u003C\u002Fli>\n\u003Cli>\u003Cstrong>خدمة كشف الحيوية\u003C\u002Fstrong> — تشغل نماذج كشف الحيوية السلبية والنشطة\u003C\u002Fli>\n\u003Cli>\u003Cstrong>خدمة التكامل مع IKD\u003C\u002Fstrong> — تتعامل مع اتصالات التحقق 1:1 مع منصة IKD الإندونيسية\u003C\u002Fli>\n\u003Cli>\u003Cstrong>خدمة التشفير\u003C\u002Fstrong> — إدارة مفاتيح AES-256، تشفير\u002Fفك تشفير القوالب\u003C\u002Fli>\n\u003Cli>\u003Cstrong>خدمة سجل التدقيق\u003C\u002Fstrong> — تسجل جميع معاملات التحقق للامتثال التنظيمي\u003C\u002Fli>\n\u003Cli>\u003Cstrong>المراقبة والتنبيهات\u003C\u002Fstrong> — صحة النظام ومقاييس الأداء وكشف الشذوذ\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>بنية تدفق البيانات\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>SDK العميل → بوابة API → المحرك البيومتري → منصة IKD\n                ↓              ↓            ↓\n        تحديد المعدل    خدمة التشفير    سجل التدقيق\n                ↓              ↓            ↓\n        ذاكرة المصادقة  إدارة المفاتيح  تخزين الامتثال\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"rust\">تنفيذ الخادم الخلفي بـ Rust\u003C\u002Fh2>\n\u003Ch3>هيكل المشروع\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>biometric-service\u002F\n├── Cargo.toml\n├── src\u002F\n│   ├── main.rs              # نقطة الدخول وإعداد الخادم\n│   ├── config.rs            # إدارة التكوين\n│   ├── routes\u002F\n│   │   ├── mod.rs\n│   │   ├── verify.rs        # نقاط نهاية التحقق\n│   │   ├── health.rs        # فحص الصحة\n│   │   └── admin.rs         # نقاط نهاية الإدارة\n│   ├── services\u002F\n│   │   ├── mod.rs\n│   │   ├── biometric.rs     # المعالجة البيومترية\n│   │   ├── liveness.rs      # كشف الحيوية\n│   │   ├── ikd.rs           # عميل منصة IKD\n│   │   ├── crypto.rs        # عمليات التشفير\n│   │   └── audit.rs         # سجل التدقيق\n│   ├── models\u002F\n│   ├── middleware\u002F\n│   └── errors.rs\n├── migrations\u002F\n└── tests\u002F\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>نقطة نهاية التحقق الأساسية\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-rust\">use axum::{extract::State, Json};\nuse chrono::Utc;\nuse uuid::Uuid;\n\n\u002F\u002F\u002F نقطة نهاية التحقق الرئيسية — تتعامل مع تدفق التحقق البيومتري الكامل\npub async fn verify_biometric(\n    State(state): State&lt;AppState&gt;,\n    Json(req): Json&lt;VerificationRequest&gt;,\n) -&gt; Result&lt;Json&lt;VerificationResponse&gt;, AppError&gt; {\n    let transaction_id = Uuid::new_v4();\n    let started_at = Utc::now();\n\n    \u002F\u002F 1. التحقق من الطلب\n    req.validate()?;\n\n    \u002F\u002F 2. كشف الحيوية\n    let liveness = state.liveness_service\n        .detect(&amp;req.capture_data)\n        .await\n        .map_err(|e| {\n            state.audit.log_failure(\n                transaction_id, \"liveness_failed\", &amp;e\n            );\n            e\n        })?;\n\n    if !liveness.is_live {\n        return Err(AppError::LivenessCheckFailed);\n    }\n\n    \u002F\u002F 3. استخراج القالب البيومتري\n    let template = state.biometric_engine\n        .extract(&amp;req.facial_image)\n        .await?;\n\n    \u002F\u002F 4. تشفير القالب للنقل\n    let encrypted = state.crypto_service\n        .encrypt_template(&amp;template)\n        .await?;\n\n    \u002F\u002F 5. التحقق 1:1 مع IKD\n    let ikd_result = state.ikd_client\n        .verify(&amp;req.nik, &amp;encrypted)\n        .await?;\n\n    \u002F\u002F 6. تسجيل سجل التدقيق\n    let elapsed = Utc::now() - started_at;\n    state.audit.log_verification(AuditRecord {\n        transaction_id,\n        nik_hash: hash_nik(&amp;req.nik),\n        liveness_score: liveness.confidence,\n        match_score: ikd_result.score,\n        verified: ikd_result.matched,\n        duration_ms: elapsed.num_milliseconds(),\n        timestamp: started_at,\n    }).await?;\n\n    Ok(Json(VerificationResponse {\n        transaction_id,\n        verified: ikd_result.matched,\n        confidence: ikd_result.score,\n    }))\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>خدمة تشفير AES-256\u003C\u002Fh3>\n\u003Cp>وفقًا لمتطلبات UU PDP ولائحة KOMDIGI، يجب تشفير جميع القوالب البيومترية بـ AES-256:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">use aes_gcm::{Aes256Gcm, KeyInit, Nonce};\nuse aes_gcm::aead::Aead;\nuse rand::RngCore;\n\npub struct CryptoService {\n    cipher: Aes256Gcm,\n}\n\nimpl CryptoService {\n    pub fn new(key: &amp;[u8; 32]) -&gt; Self {\n        let cipher = Aes256Gcm::new_from_slice(key)\n            .expect(\"AES-256 key must be 32 bytes\");\n        Self { cipher }\n    }\n\n    pub async fn encrypt_template(\n        &amp;self,\n        template: &amp;BiometricTemplate,\n    ) -&gt; Result&lt;EncryptedTemplate, CryptoError&gt; {\n        let mut nonce_bytes = [0u8; 12];\n        rand::thread_rng().fill_bytes(&amp;mut nonce_bytes);\n        let nonce = Nonce::from_slice(&amp;nonce_bytes);\n\n        let plaintext = bincode::serialize(template)?;\n        let ciphertext = self.cipher\n            .encrypt(nonce, plaintext.as_ref())\n            .map_err(|_| CryptoError::EncryptionFailed)?;\n\n        Ok(EncryptedTemplate {\n            ciphertext,\n            nonce: nonce_bytes.to_vec(),\n            algorithm: \"AES-256-GCM\".into(),\n        })\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">قابلية التوسع والأداء\u003C\u002Fh2>\n\u003Ch3>تحدي الحجم الإندونيسي\u003C\u002Fh3>\n\u003Cp>مع أكثر من 270 مليون نسمة و345 مليون بطاقة SIM نشطة، فإن متطلبات التوسع لنظام التحقق البيومتري هائلة:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>تقدير حمل الذروة\u003C\u002Fstrong>: بافتراض 50 مليون تسجيل جديد في أول 6 أشهر، حوالي 278,000 عملية تحقق يوميًا في المتوسط\u003C\u002Fli>\n\u003Cli>\u003Cstrong>ساعات الذروة\u003C\u002Fstrong>: بالنظر إلى أنماط ساعات العمل الإندونيسية، قد تكون الذروة 3-5 أضعاف المتوسط، أي 830,000 إلى 1,390,000 يوميًا\u003C\u002Fli>\n\u003Cli>\u003Cstrong>الطلبات في الثانية\u003C\u002Fstrong>: ذروة تقريبية 16 TPS، مع الحاجة لهامش لحركة المرور المفاجئة\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>استراتيجية التوسع الأفقي\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-rust\">#[tokio::main]\nasync fn main() {\n    let config = Config::from_env();\n\n    let pool = PgPoolOptions::new()\n        .max_connections(config.db_max_connections)\n        .min_connections(config.db_min_connections)\n        .acquire_timeout(Duration::from_secs(3))\n        .connect(&amp;config.database_url)\n        .await\n        .expect(\"Failed to create pool\");\n\n    let app = Router::new()\n        .route(\"\u002Fapi\u002Fv1\u002Fverify\", post(verify_biometric))\n        .route(\"\u002Fhealth\", get(health_check))\n        .layer(RateLimitLayer::new(config.rate_limit))\n        .layer(TimeoutLayer::new(Duration::from_secs(10)))\n        .with_state(AppState::new(pool, config));\n\n    let listener = TcpListener::bind(&amp;config.bind_addr)\n        .await\n        .expect(\"Failed to bind\");\n\n    axum::serve(listener, app).await.unwrap();\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"uu-pdp\">تنفيذ الامتثال لـ UU PDP\u003C\u002Fh2>\n\u003Ch3>سياسة الاحتفاظ بالبيانات\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-rust\">\u002F\u002F\u002F مهمة مجدولة: تنظيف سجلات التدقيق المنتهية\npub async fn cleanup_expired_records(\n    pool: &amp;PgPool,\n) -&gt; Result&lt;u64, sqlx::Error&gt; {\n    \u002F\u002F متطلب UU PDP: الاحتفاظ بسجلات التحقق لمدة 5 سنوات\n    let cutoff = Utc::now() - chrono::Duration::days(5 * 365);\n\n    let result = sqlx::query(\n        \"DELETE FROM audit_logs WHERE created_at &lt; $1\"\n    )\n    .bind(cutoff)\n    .execute(pool)\n    .await?;\n\n    Ok(result.rows_affected())\n}\n\n\u002F\u002F\u002F طلب حذف بيانات المستخدم (حق النسيان)\npub async fn handle_deletion_request(\n    pool: &amp;PgPool,\n    nik_hash: &amp;str,\n) -&gt; Result&lt;DeletionReport, AppError&gt; {\n    let mut tx = pool.begin().await?;\n\n    let templates_deleted = sqlx::query(\n        \"DELETE FROM biometric_templates WHERE nik_hash = $1\"\n    )\n    .bind(nik_hash)\n    .execute(&amp;mut *tx)\n    .await?\n    .rows_affected();\n\n    let logs_anonymized = sqlx::query(\n        \"UPDATE audit_logs SET nik_hash = 'anonymized' WHERE nik_hash = $1\"\n    )\n    .bind(nik_hash)\n    .execute(&amp;mut *tx)\n    .await?\n    .rows_affected();\n\n    tx.commit().await?;\n\n    Ok(DeletionReport {\n        templates_deleted,\n        logs_anonymized,\n        completed_at: Utc::now(),\n    })\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">توصيات النشر\u003C\u002Fh2>\n\u003Ch3>مراكز البيانات في إندونيسيا\u003C\u002Fh3>\n\u003Cp>وفقًا للائحة KOMDIGI ومتطلبات UU PDP، يجب أن تتم المعالجة البيومترية في مراكز بيانات في إندونيسيا. المواقع الموصى بها:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>الرئيسي\u003C\u002Fstrong>: جاكرتا (قرب من غالبية المستخدمين ومنصة IKD)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>التعافي من الكوارث\u003C\u002Fstrong>: سورابايا أو بالي (التكرار الجغرافي)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>CDN\u003C\u002Fstrong>: عقد حافة وطنية (لتوزيع SDK والموارد الثابتة)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"\">الخلاصة\u003C\u002Fh2>\n\u003Cp>بناء نظام تحقق بيومتري متوافق مع لائحة KOMDIGI في إندونيسيا هو تحدٍ هندسي معقد لكن قابل للإدارة. النقاط الرئيسية:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>الأمان أولاً\u003C\u002Fstrong>: تشفير AES-256، نقل TLS 1.3، بنية عدم الثقة\u003C\u002Fli>\n\u003Cli>\u003Cstrong>مدفوع بالامتثال\u003C\u002Fstrong>: حماية بيانات UU PDP، الاحتفاظ بسجلات التدقيق لمدة 5 سنوات، حق حذف المستخدم\u003C\u002Fli>\n\u003Cli>\u003Cstrong>تصميم قابل للتوسع\u003C\u002Fstrong>: التوسع الأفقي، التخزين المؤقت متعدد المستويات، المعالجة غير المتزامنة\u003C\u002Fli>\n\u003Cli>\u003Cstrong>نشر محلي\u003C\u002Fstrong>: مراكز بيانات إندونيسية، تحسين عرض النطاق المنخفض، دعم تنوع الأجهزة\u003C\u002Fli>\n\u003Cli>\u003Cstrong>مراقبة شاملة\u003C\u002Fstrong>: مقاييس في الوقت الفعلي، كشف الشذوذ، تقارير الامتثال\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>بناء هذا النظام بـ Rust وAxum يوفر ضمانات أداء وأمان ممتازة مع تلبية المتطلبات التنظيمية الصارمة في إندونيسيا.\u003C\u002Fp>\n","ar","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:41.100992Z","نظام التحقق البيومتري بنية إندونيسيا",null,"index, follow",[20,25,29],{"id":21,"name":22,"slug":23,"created_at":24},"c0000000-0000-0000-0000-000000000008","AI","ai","2026-03-28T10:44:21.513630Z",{"id":26,"name":27,"slug":28,"created_at":24},"c0000000-0000-0000-0000-000000000011","Biometrics","biometrics",{"id":30,"name":31,"slug":32,"created_at":24},"c0000000-0000-0000-0000-000000000013","Security","security",[34,41,47],{"id":35,"title":36,"slug":37,"excerpt":38,"locale":12,"category_name":39,"published_at":40},"d0000000-0000-0000-0000-000000000686","لماذا Bali تتحول إلى مركز تكنولوجيا التأثير في جنوب شرق آسيا 2026","limadha-bali-tatahawwal-markaz-tiknulujia-attathir-janub-sharq-asia-2026","تحتل Bali المرتبة 16 بين أنظمة الشركات الناشئة في جنوب شرق آسيا. مع تركيز متزايد لبناة Web3 وشركات AI المستدامة الناشئة وشركات تكنولوجيا السفر البيئي، تنحت الجزيرة مكانتها كعاصمة تكنولوجيا التأثير في المنطقة.","الهندسة","2026-03-28T10:44:50.120618Z",{"id":42,"title":43,"slug":44,"excerpt":45,"locale":12,"category_name":39,"published_at":46},"d0000000-0000-0000-0000-000000000685","فسيفساء حماية البيانات في ASEAN: قائمة امتثال للمطورين","fusayfisa-himayat-albayanat-asean-qaimat-imtithal-lilmutawwirin","تمتلك سبع دول في ASEAN الآن قوانين شاملة لحماية البيانات، لكل منها نماذج موافقة ومتطلبات توطين وهياكل عقوبات مختلفة. إليك قائمة امتثال عملية للمطورين الذين يبنون تطبيقات متعددة البلدان.","2026-03-28T10:44:50.114369Z",{"id":48,"title":49,"slug":50,"excerpt":51,"locale":12,"category_name":39,"published_at":52},"d0000000-0000-0000-0000-000000000684","التحول الرقمي في Indonesia بقيمة 29 مليار دولار: فرص لشركات البرمجيات","attahawwul-arraqami-indonesia-29-milyar-dular-furas-sharikat-albarmajiyat","من المتوقع أن يصل سوق خدمات تكنولوجيا المعلومات في Indonesia إلى 29.03 مليار دولار في 2026، ارتفاعاً من 24.37 مليار دولار في 2025. البنية التحتية السحابية والذكاء الاصطناعي والتجارة الإلكترونية ومراكز البيانات تقود أسرع نمو في جنوب شرق آسيا.","2026-03-28T10:44:50.092728Z",{"id":13,"name":54,"slug":55,"bio":56,"photo_url":17,"linkedin":17,"role":57,"created_at":58,"updated_at":58},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]