مصطفی جعفرزاده
مصطفی جعفرزاده
خواندن ۴ دقیقه·۲ ماه پیش

تلفیق امنیت و سرعت: پیاده‌سازی سیستم احراز هویت چندعاملی با Shamir’s Secret Sharing و AVL Tree در NestJS


مقدمه

احراز هویت چندعاملی (MFA) یکی از بهترین روش‌ها برای تضمین امنیت سیستم‌ها و حفاظت از دسترسی‌های حساس است. با افزایش حملات سایبری، سازمان‌ها به راهکارهای پیشرفته‌تری برای مدیریت اطلاعات احراز هویت نیاز دارند. این مقاله یک روش نوآورانه برای بهبود امنیت و کارایی سیستم‌های MFA ارائه می‌دهد، که در آن از الگوریتم Shamir’s Secret Sharing برای تقسیم امن اطلاعات و AVL Tree برای جستجوی سریع و کارآمد استفاده شده است.

نکته مهم :در تهیه این مقاله از هوش مصنوعی کمک گرفته شده است

توضیحات تکنیکی و معماری پیشنهادی

سیستم پیشنهادی از دو تکنیک کلیدی استفاده می‌کند:

1. Shamir’s Secret Sharing (SSS): یک روش رمزنگاری برای تقسیم یک راز (مانند کدهای امنیتی یا اطلاعات بیومتریک) به چندین بخش. این روش تضمین می‌کند که تنها با جمع‌آوری تعداد مشخصی از این بخش‌ها می‌توان راز اصلی را بازسازی کرد.

2. AVL Tree: یک ساختار داده متعادل برای ذخیره و جستجوی سریع اطلاعات. این ساختار تضمین می‌کند که عملیات‌های جستجو، درج و حذف با کارایی بالا انجام شوند.

ساختار پروژه

/src

| /controllers

| | data.controller.ts

|

| /services

| | shamir.service.ts

| | avl.service.ts

|

| /modules

| | shamir.module.ts

| | avl.module.ts

|

| app.module.ts

کد پیاده‌سازی و توضیحات

1. کنترلر اصلی: data.controller.ts

typescript

// /src/controllers/data.controller.ts
import { Controller, Post, Body, HttpException, HttpStatus } from '@nestjs/common';
import { ShamirService } from '../services/shamir.service';
import { AvlService } from '../services/avl.service';
@Controller('data')
export class DataController {
constructor(
private readonly shamirService: ShamirService,
private readonly avlService: AvlService,
) {}
@Post('split')
async splitSecret(
@Body('secret') secret: string,
@Body('total') total: number,
@Body('threshold') threshold: number,
) {
try {
const shares = await this.shamirService.splitSecret(secret, total, threshold);
shares.forEach(async (share, index) => {
await this.avlService.addShare(index, share);
});
return { message: 'Secret split, encrypted, and stored in AVL Tree', shares };
} catch (error) {
throw new HttpException('Failed to split the secret', HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@Post('combine')
async combineShares() {
try {
const shares = this.avlService.getAllShares();
if (shares.length === 0) {
throw new HttpException('No shares available to combine', HttpStatus.BAD_REQUEST);
}
const secret = await this.shamirService.combineShares(shares);
return { secret };
} catch (error) {
throw new HttpException('Failed to combine the shares', HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}

توضیح کاربرد: این کنترلر مسئول مدیریت عملیات احراز هویت است. تابع splitSecret، اطلاعات احراز هویت را به بخش‌های امن تقسیم و ذخیره می‌کند. تابع combineShares، این بخش‌ها را برای بازسازی اطلاعات اصلی جمع‌آوری می‌کند.

2. سرویس Shamir’s Secret Sharing با رمزنگاری AES: shamir.service.ts


// /src/services/shamir.service.ts
import { Injectable } from '@nestjs/common';
import as crypto from 'crypto';
import as secretSharing from 'secretsharing';
@Injectable()
export class ShamirService {
private readonly encryptionKey: Buffer;
constructor() {
this.encryptionKey = crypto.randomBytes(32);
}
private encrypt(data: string): string {
const iv = crypto.randomBytes(16);
const cipher = crypto.createCipheriv('aes256cbc', this.encryptionKey, iv);
const encrypted = Buffer.concat([cipher.update(data, 'utf8'), cipher.final()]);
return iv.toString('hex') + ':' + encrypted.toString('hex');
}
private decrypt(data: string): string {
const [iv, encrypted] = data.split(':').map(part => Buffer.from(part, 'hex'));
const decipher = crypto.createDecipheriv('aes256cbc', this.encryptionKey, iv);
const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
return decrypted.toString('utf8');
}
async splitSecret(secret: string, totalShares: number, threshold: number): Promise<string[]> {
const shares = secretSharing.split(secret, { shares: totalShares, threshold });
return shares.map(share => this.encrypt(share));
}
async combineShares(encryptedShares: string[]): Promise<string> {
const shares = encryptedShares.map(share => this.decrypt(share));
return secretSharing.combine(shares);
}
}

توضیح کاربرد: این سرویس اطلاعات احراز هویت را به بخش‌های امن تقسیم و رمزنگاری می‌کند. رمزنگاری AES تضمین می‌کند که حتی در صورت دسترسی غیرمجاز، داده‌ها امن باقی می‌مانند.

3. سرویس AVL Tree با استفاده از Redis: avl.service.ts


// /src/services/avl.service.ts
import { Injectable } from '@nestjs/common';
import AVLTree from 'avl';
import as Redis from 'ioredis';
@Injectable()
export class AvlService {
private tree: AVLTree<number, string>;
private redisClient: Redis.Redis;
constructor() {
this.tree = new AVLTree<number, string>();
this.redisClient = new Redis();
}
async addShare(key: number, share: string) {
this.tree.insert(key, share);
await this.redisClient.set(share:${key}, share);
}
async findShare(key: number): Promise<string | null> {
const cachedShare = await this.redisClient.get(share:${key});
if (cachedShare) return cachedShare;
return this.tree.find(key) || null;
}
async removeShare(key: number) {
this.tree.remove(key);
await this.redisClient.del(share:${key});
}
getAllShares(): string[] {
const shares: string[] = [];
this.tree.forEach((key, value) => {
shares.push(value);
});
return shares;
}
}

توضیح کاربرد: این سرویس بخش‌های اطلاعات را در ساختار AVL Tree ذخیره و مدیریت می‌کند. استفاده از Redis برای ذخیره موقت باعث بهبود سرعت و کارایی سیستم می‌شود.

مزایای این روش

1. امنیت بالا: با استفاده از SSS و رمزنگاری AES، حتی در صورت دسترسی به بخشی از داده‌ها، مهاجم نمی‌تواند به اطلاعات کامل دسترسی پیدا کند.

2. سرعت و کارایی: AVL Tree تضمین می‌کند که عملیات‌های جستجو بهینه و سریع انجام شوند. استفاده از Redis نیز زمان دسترسی به داده‌ها را کاهش می‌دهد.

3. قابلیت مقیاس‌پذیری: این سیستم می‌تواند در محیط‌های توزیع‌شده پیاده‌سازی شود و به راحتی با افزایش تعداد کاربران و درخواست‌ها سازگار شود.

نتیجه‌گیری

در این مقاله، یک راهکار پیشرفته برای پیاده‌سازی احراز هویت چندعاملی با استفاده از Shamir’s Secret Sharing و AVL Tree ارائه شد. این روش امنیت بالایی دارد و می‌تواند به‌طور موثری از اطلاعات حساس محافظت کند. همچنین، به دلیل استفاده از ساختارهای داده بهینه و تکنیک‌های کش، سرعت و کارایی سیستم بهبود می‌یابد. این پیاده‌سازی برای سازمان‌هایی که به امنیت و عملکرد بالا نیاز دارند، یک انتخاب مناسب است.

ساختمان داده
برنامه نویس علاقه مند به طراحی الگوریتم
شاید از این پست‌ها خوشتان بیاید