নিরাপদ ক্রিপ্টোগ্রাফিক কীগুলির জন্য আমি কী স্ট্যান্ড :: অ্যারের জন্য একটি কাস্টম বরাদ্দ ব্যবহার করতে পারি?


9

আমি জানি std::arrayযে স্ট্যাকটিতে সম্পূর্ণ বরাদ্দ, তবে এই প্রশ্নটি সুরক্ষা উদ্বেগ দ্বারা অনুপ্রাণিত যা দুটি জিনিস প্রয়োজন:

  1. এতে থাকা ডেটাটি std::arrayজিরোড বা ধ্বংসের এলোমেলোভাবে হবে
  2. ডাটা std::arrayকরা হবে লক , এই ধরনের এটি কখনও তন্ন তন্ন ক্র্যাশ বা swap 'র মেমরিতে ডিস্কে যায়

সাধারণত, এর সাথে std::vectorসমাধানটি হ'ল একটি কাস্টম বরাদ্দকারী তৈরি করুন যা এই জিনিসগুলি করে । তবে, এর জন্য std::array, আমি কীভাবে এটি করব তা দেখছি না এবং তাই এই প্রশ্নটি।

আমি যা করতে পারি তা হ'ল:

template <typename T, std::size_t Size>
struct SecureArray : public std::array<T, Size>
{
    static_assert(std::is_pod<T>::value, "Only POD types allowed")
    static_assert(sizeof(T) == 1, "Only 1-byte types allowed")
    virtual ~SecureArray()
    {
        std::vector<uint8_t> d = RandomBytes(Size); // generates Size random bytes
        std::memcpy(this->data(), d.data(), Size);
    }
}

তবে এতে স্পষ্টতই মেমরি লকিংয়ের অভাব রয়েছে এবং এর কার্য সম্পাদন স্কিমটিকে প্রথম স্থানে std::arrayব্যবহার করে অর্জন করা জটিল করে তোলে std::array

এর চেয়ে ভাল সমাধান আর কি আছে?


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
স্যামুয়েল লিউ

দুঃখিত, এটি মোডগুলির জন্য ছিল; অন্যটি মোড যা পতাকা প্রত্যাখ্যান করেছিল, আপনি নয়। কেবলমাত্র আপনি যা করতে পারেন তা অবশ্যই অবশ্যই সঠিকভাবে উত্তরগুলি সঠিক কিনা না তা নির্দেশ করে, তাই আমি অনুগ্রহটি সর্বোত্তমটিকে নির্ধারণ করতে পারি। আমি অবশ্যই নিজেকে বিকশিত করতে পারি, তবে আমি এত বড় বিশেষজ্ঞ নই। বরাদ্দ হওয়ার কারণটি নির্ধারিত হয়ে গেলে যেভাবে যাইহোক অদৃশ্য হয়ে যায়।
মার্টেন বোদেউয়েস

@ মার্টেন-রিস্টেস্টমোনিকা দুর্ভাগ্যক্রমে কোনও উত্তরই পরিষ্কার উপায়ে সমস্যার সমাধান করতে পারে না।
কোয়ান্টাম পদার্থবিদ

@ দ্য কিকান্টাম ফিজিসিস্ট এটি একটি পরিষ্কার উপায় হিসাবে বিবেচিত হতে হবে কি? আপনি কি এই প্রয়োজনীয়তাগুলি স্পষ্ট করে দেখতে চেষ্টা করতে পারেন? এটি সম্ভাব্য সমাধান সম্পর্কেও ভাবতে সহায়তা করে। আমি মনে করি আপনি কী বলতে চাইছেন তা আমি জানি তবে আপনি সম্ভবত আরও সুনির্দিষ্ট হতে পারেন I
মার্টেন বোদেউয়েস

@ মার্টেন-রিস্টেস্টমোনিকা এমন একটি বরাদ্দকারী ব্যবহার করে যা ইতিমধ্যে আমাদের কোনও উপায়ে রয়েছে। স্ক্র্যাচ থেকে স্টাফ পুনরায় লেখাই একটি খারাপ ধারণা এবং পরীক্ষার জন্য এটি নরক প্রয়োজন। এটিই শেষ অবলম্বন হওয়া উচিত। নীচের উত্তরগুলি সুস্পষ্ট সমাধানের পরামর্শ দিচ্ছে যা আমি ইতিমধ্যে উল্লেখ করেছি আমি মন্তব্যগুলিতে এড়া করছি (তাদের চ্যাট করতে যাওয়ার আগে)।
কোয়ান্টাম পদার্থবিদ

উত্তর:


5

std::arrayবরাদ্দকারী ব্যবহার করতে পারে না; তবে মনে হচ্ছে আপনার সিকিওরআরে ক্লাসটি কাস্টম কনস্ট্রাক্টর / ডিকনস্ট্রাক্টরের মাধ্যমে আপনি যা চান তা অর্জন করতে পারে।

এটার মতো কিছু:

#include <sys/mman.h>

template<class T, std::size_t Size>
struct SecureArray : public std::array<T, Size>
{
    // Your static_asserts...

    SecureArray(void) {
        mlock(std::array<T, Size>::data(), sizeof(T) * Size);
    }

    ~SecureArray(void) {
        char *bytes = reinterpret_cast<char *>(std::array<T, Size>::data());
        for (std::size_t i = 0; i < sizeof(T) * Size; i++)
            bytes[i] = 0;
        munlock(bytes, sizeof(T) * N);
    }
};

4

আমি জানি std::arrayস্ট্যাকের মধ্যে সম্পূর্ণ বরাদ্দ রয়েছে

এটি বেশ সত্য নয়। std::arrayকোনও মেমরি বরাদ্দ করে না, তাই এটি আপনি কোথায় বরাদ্দ করেন তার উপর নির্ভর করে।

auto* arr = new std::array<int, 100>(); // BUM! it is allocated on the heap

তবে এতে স্পষ্টতই মেমরি লকিংয়ের অভাব রয়েছে এবং এর কার্য সম্পাদন স্কিমটিকে প্রথম স্থানে std::arrayব্যবহার করে অর্জন করা জটিল করে তোলে std::array

প্রথমত, স্ট্যাকটিতে মেমরি লক করা কোনও সমস্যা নয়। পসিক্স উদাহরণ দেখুন:

#include <iostream>
#include <sys/mman.h>
#include <array>

int main()
{
    std::array<int, 3> a = {1, 2, 3};        // std::array allocated on the stack
    if (mlock(a.data(), sizeof(a)) == 0)
    {
        std::cout << "LOCKED" << std::endl;
    }
}

সুতরাং, আপনি কেবল কল করতে পারেন mlockবা SecureArrayকনস্ট্রাক্টরের কোনও পোর্টেবল অ্যানালগ ।

দ্বিতীয়ত, আপনি কোন পারফরম্যান্স লাভের প্রত্যাশা করছেন? মেমরি পড়ার / লেখার গতি নির্ভর করে না আপনি কোথায় আপনার অ্যারে বরাদ্দ করেন, গাদা বা স্ট্যাকের উপরে। সুতরাং, আপনি মেমরিটি কত দ্রুত বরাদ্দ করতে এবং লক করতে পারেন তা সমস্ত কিছু। যদি পারফরম্যান্স সমালোচনামূলক হয় তবে মেমরি লক করা খুব ধীর হতে পারে (বা না, কে জানে?) SecureArrayস্ট্যাকের উপর মেমরি বরাদ্দ থাকলেও প্রতিবার কনস্ট্রাক্টরে কল করার জন্য।

সুতরাং, std::vectorকাস্টম বরাদ্দকারীর সাথে এটি ব্যবহার করা আরও সহজ । এটি বড় মেমরি খণ্ডগুলি প্রিলোকল্ট এবং প্রলক করতে পারে, তাই বরাদ্দকরণের গতি স্ট্যাকের মতো প্রায় তত দ্রুত হবে।


এটি মোটেও গতি নয়, এটি সুরক্ষা এবং নিশ্চিত করা যে জিনিসগুলি সরানো হচ্ছে না, কারণ সরানোর অর্থ সাধারণত অনুলিপি করা হয়।
মার্টেন বোদেউয়েস

2
@ মার্টেন-রিস্টেস্টমোনিকা হুম ... মনে হয় আমি প্রথমে ব্যবহারের std::arrayবদলে ব্যবহার করার ইচ্ছাটি পাইনি std::vector। আমি ভেবেছিলাম এটি বরাদ্দের গতি সম্পর্কে।
Stas
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.