رمزگذاری فایل – یک هش HMAC از اطلاعات متن ساده به اندازه کافی امن برای استفاده به عنوان یک شاخص جستجو برای داده های رمز شده

من بر روی یک برنامه کار می کنم که فایل ها را از سرورهای خارجی بر روی https بارگیری می کند و آنها را روی دیسک ذخیره می کند به نحوی نسبتا امن. به طور خاص، با استفاده از یک رمزنگاری منحصر به فرد رمزنگاری شده، یک بلوک رمزگذاری AES256، حالت بلوک CTR و یک هش HMAC از داده های رمزگذاری شده و IV.

یکی از الزامات این پروژه این است که هیچ فایل تکراری نباید ذخیره شود. با توجه به نیاز به یک منحصر به فرد IV به طور امن ذخیره فایل ها، من می توانم به سادگی از هش از فایل رمزگذاری شده استفاده کنید تا ببینید آیا نسخه کپی شده است. یک sha256 یا sha512 از محتوای متن ساده کافی نیست، زیرا مشتری می تواند فایل های تک کاراکتری را دانلود و ذخیره کند و محتویات آنها را به راحتی حدس بزند، که به طور بالقوه می تواند سیستم را تا برنده های معروف متن ساده شناخته شود.

بنابراین من تعجب می کردم که آیا این برای نگهداری هش های HMAC از متن ساده، با استفاده از یک کلید مشتق شده از Argon2ID به عنوان کلید امضای HMAC، به راحتی در نظر گرفته شود؟

این هش ها در یک پایگاه داده کلید / ارزش ذخیره می شوند و به عنوان یک کلید جستجو برای دیدن اینکه آیا یک فایل دانلود شده است که ما قبلا آن را داشته ایم، استفاده می شود. کلید Argon2ID هرگز ذخیره نخواهد شد.

api – HMAC و با استفاده از فیلد تصادفی ایمن رمزنگاری به عنوان پیام

بگو که من یک برنامه بزرگ دارم که می خواهم یک API امن ایجاد کنم. راه های استاندارد رفتن این است که با کلید عمومی API و یک کلید API مخفی کار کنند و این را به کاربر ارائه دهند. بعد، در هر درخواست API، پیام ها با استفاده از MAC بر روی کلید مخفی و (بخشی از) پیام امضا می شوند.

اکنون، از آنجا که این برنامه بزرگ است، نمی خواهم انتخاب کنم در صورت درخواست API من برای پاسخ دادن به یک سؤال، message = answer ، اگر درخواست API من برای ارسال نظر بود message = comment و غیره …).

برای راحتی، از این به بعد می خواهم یک فیلد تصادفی ایمن رمزنگاری اضافه کنم، که بر روی هر درخواست اضافه می شود (اجازه دهید با نام این نمک نام خود را بنویسیم). به این ترتیب من می توانم یک تأیید درخواست را که همه شرایط را پوشش می دهد بنویسم.

پرسش های من در حال حاضر است:

آیا این ایده خوبی است و چرا (نه) خیلی؟