من فقط برای سرگرمی یک سرور رسانه ای کوچک درست می کنم ، اما می خواهم بدانم آنچه فکر می کنم معقول است.

ایده این است که پرونده ها بر روی رمزگذاری شده روی سرور ذخیره می شوند. کلید رمزگذاری فایل (از این پس FEK) نیز بر روی سرور ذخیره می شود ، اما با استفاده از یک کلید 2 رمزگذاری شده از رمز کاربر (از این پس به بعد PDK) رمزگذاری می شود.

اینگونه کار خواهد کرد:

  1. ورود به سیستم 2 مرحله ای خواهد بود. ابتدا کاربر نام کاربری خود را وارد می کند.
  2. در صورت وجود کاربر ، سرور دو نمک ثابت ، برای هر کاربر و یک تکرار دیگر را ارسال می کند.
  3. مشتری از اولین نمک برای هش کردن رمز عبور خود با 1 استفاده می کند. تکرار sha256 آنها این کار را به سرور ارسال می کنند.
  4. سرور این رمز عبور هش شده را می گیرد و با یک نمک 3 و بسیاری از تکرارها (PBKDF2) مجدداً شلیک می کند و از این کار برای احراز هویت کاربر استفاده می کند.
  5. در ضمن ، مشتری از نمک 2 و # استفاده می کند. از تکرارهایی که قبلاً سرور ارسال شده بود ، همچنین با PBKDF2 ، برای ایجاد PDK.
  6. اگر کاربر با موفقیت تأیید شود ، سرور کلید رمزگذاری شده را ارسال می کند (FEK).
  7. مشتری از رمزگشایی FEK با استفاده از PDK استفاده می کند.
  8. FEK رمزگشایی شده برای رمزگذاری و رمزگشایی کلیه پرونده های سمت مشتری استفاده می شود.

منطقی: رمز عبور از طریق HTTPS ارسال می شود ، اما با فرض اینکه سرور من کاملاً به خطر بیفتد (مهاجم به SSH دسترسی دارد) ، پس می توانند صبر کنید تا شخصی وارد شود و رمزعبور متن ساده را بدست آورد. یک تکرار از sha256 حفاظت زیادی را ارائه نمی دهد ، اما این نوعی سناریوی بدترین حالت است ، و من نمی خواهم مقدار زمانی را که منتظر PBKDF2 هستیم (یک بار در مشتری ، دوباره روی سرور) دو برابر کنم.

اگر مهاجم موفق به بارگیری دیتابیس شود ، باید مجدداً روی سرور مجدداً راه اندازی شود ، اما شاید دسترسی کامل و مداوم نداشته باشد. این باعث می شود خیلی سریع رمزعبورها از بین نروند.

من قبل از تأیید اعتبار ، 2مین نمک و # تکرار را برای مشتری ارسال کردم تا بتوانیم موازی (4) و (5) باشیم. آیا نمک و # تکرار آنها واقعاً نیازی به پنهانی نیستند؟

از آنجا که سرور هرگز رمز ساده متن را نمی بیند ، هرگز نمی تواند FEK را که مهمترین آن است رمزگشایی کند.

ما از نمک های مختلف استفاده می کنیم برای گرفتن 2 کلید مختلف از 1 رمز عبور. یکی رمز رمزگذاری شده برای تأیید اعتبار است ، و دیگری رمز شناسایی است.

من همچنین می خواهم با استفاده از هش ها فایل-فایل کشی را انجام دهم. من می دانم که این همچنین برخی از اطلاعات را فاش می کند ، بنابراین قصد دارم از FEK برای هش پرونده نیز استفاده کنم. بنابراین من فقط می توانم deduplication فایل های مربوط به هر کاربر را انجام دهم ، اما این به اندازه کافی خوب است.

اگر کاربر رمزعبور خود را تغییر دهد ، من به سادگی FEK را دوباره رمزگذاری می کنم و آن را برای محافظت دوباره به سرور می فرستم. نیازی به رمزگذاری مجدد پرونده ها نیست.

آیا اینها همه معنی دارند؟ مشکلی در برنامه من وجود دارد؟

اوه ، من هم فکر می کنم aes-256-cbc با IV های هر پرونده برای رمزگذاری ، HMAC-SHA256 برای هش پرونده ، PBKDF2 w / sha256 و نیمی ارزش دوم تکرار هم برای هش رمز عبور و هم برای PDK.