رمزنگاری – AES CBC با mysql و python

من یک برنامه کوچکی نوشتم که رمزهای عبور را در پایتون ذخیره می کند. من به DB با Mysqldb دسترسی دارم.
میخواهم رمز را با AES 256 با CBC رمزگذاری کنم. من تلاش می کنم این کار را با SQL AES_ENCRYPT انجام دهم.

حالت cbc را با:
mysql> SET block_encryption_mode = 'aes-256-cbc'؛

بنابراین در پایتون، من:

 `def add_password (خود، جدول، سایت، رمز عبور، کلید، iv):
        تلاش كردن:
            query = "INSERT INTO" + table + "(سایت ها، رمز عبور) ارزش ها (AES_ENCRYPT (٪ s،٪ s،٪ s)، AES_ENCRYPT (٪ s،٪ s،٪ s)
            self.cursor.execute (query (site، key، iv، password، key، iv))
            self.conn.commit ()
        ... `

اما اگر یک برنامه اجرا کنم:
هشدار: گزینه نادیده گرفته شده است ، مانند اگر تابع از حالت ECB استفاده کند (بنابراین بدون iv)

کجا اشتباه است

راه ممکن:
یا بهتر است که همه ماژول های پایتون را رمزگذاری کرده و داده های قبلا رمزگذاری شده را به DB اضافه کنیم؟

رمزگذاری – چگونه می توان متن ساده پیام مخفی که در AES-256 CBC است را تغییر دهید

می گویند پیام مخفی رمزگذاری شده با AES-256 در حالت CBC

 5a04ec902686fb05a6b7a338b6e07760 14c4e6965fc2ed2cd358754494aceffa

جایی که 16 بایت برای اولین بار بردار است، 16 بایت دوم متن رمز است. متن ساده پیام مخفی بالا (ASCII کد شده) ما نفس می کشد.

اکنون سوال من این است که چگونه می توانید پیام مخفی را تغییر دهید به طوری که شما امروز صبح جلسه صوتی را دریافت خواهید کرد اگر آن را رمزگشایی کنید؟


تلاش کردم نمونه هایی از اینترنت را پیدا کنم اما من نمی توانم پیدا کنم: /

با این حال من می توانم یک مدل پیدا کنم که توضیح دهد چگونه رمزگشایی CBC کار می کند:

 اینجا را وارد کنید تصویر

متن ساده ما ما نفس می کشد. اجرای از 16 قلمرو ساخته شده است که به این معنی است که ما فقط یک بلوک متن ساده داریم. از مدل، ما همچنین می بینیم که متن رمزنگاری رمزگشایی شده است و XOR به گونه ای است که متن رمز را ایجاد می کند. به نظر می رسد، تغییرات لازم در بردار اولیه وجود دارد، بنابراین ما پیام مورد نظر را می گیریم امشب جلسه امتحان! . اما چگونه این دقیقا انجام می شود؟

AES – امنیت رمزگذاری پرس و جو؟

امنیت بهار یک روش مفید به نام Encryptors.queryableText است. توضیح آن این است:

تفاوت بین TextEncryptor قابل پرسشی و متن TextEncryptor استاندارد مربوط به بارگزاری اولیه (iv) دست زدن است. IV استفاده شده در یک TextEncryptor # query encrypt عملیات مشترک است، یا ثابت، و به طور تصادفی تولید نمی شود. این به این معنی همان متن رمزگذاری شده چندین بار همیشه یک نتیجه رمزگذاری مشابه را تولید می کند. این کمتر امن است، اما برای داده های رمزگذاری شده ضروری است که در برابر آنها سوالی باشد. یک نمونه از متن رمزگذاری شده پرس و جو می تواند یک apiKey OAuth باشد.

به نظر می رسد از AES / CBC / PKCS5Padding با ثابت تمام صفر IV استفاده شود. (توجه: در جاوا PKCS5Padding واقعا به معنای پاک کردن PKCS # 7 است.

هدف از این روش، استفاده از متن رمزنگاری به عنوان کلید (کلید در یک نقشه / index / etc "به معنی، نه" کلید رمزگذاری "به معنای)

سوالات من هستند:

  1. استفاده عملی از چنین طرح چیست؟ من سعی کردم از یک فکر کنم،
    1. این سیستم یک کلید مخفی دارد (به عنوان مثال، یک کلید اولیه متوالی که آن را نمی خواهد مهاجم را برای شمارش).
    2. این سیستم یک متن رمز را به یک کاربر ارسال می کند که آن را بعدا ارسال می کند اطلاعات پرس و جو مربوط به آن
    3. هنگامی که کاربر متن رمزنگاری را ارسال می کند، سیستم آن را رمزگشایی می کند، پایگاه داده را جستجو می کند و اطلاعات را به دست می گیرد.

برای سناریوی ذکر شده فوق، من می توانم از بسیاری از راه حل های بهتر مشکل:

  • اگر سیستم قبل از پرسیدن آن را رمزگشایی کند، چرا یک متن رمز برای همان متن ساده وجود دارد؟ فقط از رمزگذاری مناسب با تصادفی IV استفاده کنید.
  • اگر سیستم نه آن را رمزگشایی کند، چرا از یک شناسه به طور تصادفی تولید شده به اندازه کافی مبهم استفاده نکنید؟
  • یا بهتر است کنترل دسترسی مناسب زمانی داشته باشید
  • از سند مستندات بالا، چرا یک apiKey OAuth در وهله اول رمزگذاری می شود؟

پس دقیقا این روش خوب است؟


  1. پیامدهای امنیتی این "چیست" کمتر امن "(به عنوان مستندات آن را درخواست می کند) رمزگذاری اگر استفاده شده به عنوان طراحی شده است؟