সি ++ এ সংবেদনশীল স্ট্রিংগুলিকে অস্পষ্ট করার কৌশলগুলি


88

আমার সি ++ অ্যাপ্লিকেশনটিতে সংবেদনশীল তথ্য (একটি প্রতিসম এনক্রিপশন কী যা আমি ব্যক্তিগত রাখতে চাই) সঞ্চয় করতে হবে। সহজ পদ্ধতিটি এটি করা:

std::string myKey = "mysupersupersecretpasswordthatyouwillneverguess";

তবে, stringsপ্রক্রিয়াটির মাধ্যমে অ্যাপ্লিকেশনটি চালনা করা (বা অন্য কোনও বাইনারি অ্যাপ থেকে স্ট্রিংগুলি বের করে এমন) উপরের স্ট্রিংটি প্রকাশ করবে।

এই জাতীয় সংবেদনশীল ডেটা অস্পষ্ট করার জন্য কোন কৌশলগুলি ব্যবহার করা উচিত?

সম্পাদনা করুন:

ঠিক আছে, আপনারা সকলেই বলেছেন যে "আপনার এক্সিকিউটেবল বিপরীত প্রকৌশলী হতে পারে" - অবশ্যই! এটি আমার একটি পোষা প্রাণবন্ত, সুতরাং আমি এখানে কিছুটা ভাড়া নিচ্ছি:

কেন এই সাইটের 99% (ঠিক আছে, তাই আমি সম্ভবত কিছুটা বাড়িয়ে বলছি) এর উত্তরটি "পুরোপুরি সুরক্ষিত কোনও প্রোগ্রাম তৈরি করার কোনও উপায় নেই" - এর টরেন্ট দিয়ে উত্তর দেওয়া হয়েছে - এটি সহায়ক নয় উত্তর! সুরক্ষা নিখুঁত ব্যবহারযোগ্যতা এবং এক প্রান্তে সুরক্ষা এবং নিখুঁত সুরক্ষা কিন্তু অন্যদিকে ব্যবহারের অযোগ্যতার মধ্যে একটি স্লাইডিং স্কেল।

মুল বক্তব্যটি হ'ল আপনি কী চেষ্টা করছেন এবং যে পরিবেশে আপনার সফ্টওয়্যারটি চলবে তার উপর নির্ভর করে আপনি সেই স্লাইডিং স্কেলে আপনার অবস্থানটি বেছে নিয়েছেন। আমি সামরিক স্থাপনার জন্য একটি অ্যাপ লিখছি না, আমি একটি হোম পিসির জন্য একটি অ্যাপ্লিকেশন লিখছি । আমার একটি অবিশ্বস্ত নেটওয়ার্ক জুড়ে একটি পূর্ব-পরিচিত এনক্রিপশন কী সহ ডেটা এনক্রিপ্ট করা দরকার। এই ক্ষেত্রে, "অস্পষ্টতার মাধ্যমে সুরক্ষা" সম্ভবত যথেষ্ট ভাল! অবশ্যই, যথেষ্ট সময়, শক্তি এবং দক্ষতার সাথে কেউ বাইনারিটি বিপরীত করে ইঞ্জিনিয়ার করে পাসওয়ার্ডটি খুঁজে পেতে পারে তবে অনুমান কী? আমি পাত্তা দিই না:

শীর্ষস্থানীয় সুরক্ষিত সিস্টেমটি প্রয়োগ করতে আমার যে সময় লাগে তা ক্র্যাক করা সংস্করণগুলির কারণে বিক্রয় ক্ষতির চেয়ে ব্যয়বহুল (আমি আসলে এটি বিক্রি করছি না, তবে আপনি আমার বক্তব্যটি পেয়েছেন)। এই নীল-আকাশে নতুন প্রোগ্রামারদের মধ্যে প্রোগ্রামিংয়ের প্রবণতাটি "এটি সর্বাত্মক সর্বোত্তম উপায়ে সম্ভব করতে দেয়" কমপক্ষে বলতে বোকামি।

এই প্রশ্নের উত্তর দেওয়ার জন্য সময় দেওয়ার জন্য আপনাকে ধন্যবাদ - তারা সবচেয়ে সহায়ক ছিল। দুর্ভাগ্যক্রমে আমি কেবল একটি উত্তর গ্রহণ করতে পারি, তবে আমি সমস্ত দরকারী উত্তরগুলিতে ভোট দিয়েছি।


4
সম্ভবত আপনি যদি এনক্রিপশন কী দিয়ে আপনি কী সম্পাদন করতে চেষ্টা করছেন তা বর্ণনা করে আমরা কীভাবে এটি করার প্রয়োজন এড়াতে হবে সে সম্পর্কে পরামর্শ দিতে পারি।
joshperry

4
সঠিক ডুপ্লিকেট: stackoverflow.com/questions/926172/...
কিরিল ভি Lyadvinsky

4
@ কিরিল: আপনি যে প্রশ্নটি উল্লেখ করেছেন ঠিক ঠিক এই প্রশ্নটিকে কল করা শক্ত call আসলে, ধারণা একই। প্রশ্ন হয় না।
xtofl

4
@xtofl, আপনি ভোট না দিতে স্বাধীন free আমার কাছে এটি দুটি অভিন্ন প্রশ্নের মতো দেখাচ্ছে।
কিরিল ভি লিয়াডভিনস্কি

4
(ভাঁড়ের সাথে সম্পর্কিত নয়) "ব্যক্তিগত কী" এর খুব সংজ্ঞাটি এমন কোনও পাবলিক / প্রাইভেট কী জুটির অর্ধেক যা আপনি দেন না। এই ক্ষেত্রেও, ব্যক্তিগত সার্ভিসটি আপনি আপনার সার্ভারে রেখেছেন; আপনার ক্লায়েন্ট অ্যাপ্লিকেশনটিতে সর্বজনীন।
এমসাল্টার

উত্তর:


42

মূলত, আপনার প্রোগ্রাম এবং একটি ডিবাগার অ্যাক্সেস সহ যে কেউ পারেন এবং করতে পারেন অ্যাপ্লিকেশনে কী খুঁজে পাবেন তারা চায় পারেন।

তবে, আপনি যদি নিশ্চিত করতে চান যে চলমান অবস্থায় কীটি প্রদর্শিত হবে না strings আপনার বাইনারিতে , উদাহরণস্বরূপ আপনি নিশ্চিত করতে পারেন যে কীটি মুদ্রণযোগ্য ব্যাপ্তির মধ্যে নেই।

এক্সওআর দিয়ে অস্পষ্ট কী

উদাহরণস্বরূপ, আপনি কীওয়ারকে দুটি বাইট অ্যারেতে বিভক্ত করতে XOR ব্যবহার করতে পারেন:

key = key1 XOR key2

যদি আপনি একই বাইট-দৈর্ঘ্যের সাথে কী 1 তৈরি করেন যা keyআপনি এলোমেলো বাইট মান ব্যবহার করতে পারেন (সম্পূর্ণ) এবং তারপরে গণনা করুন key2:

key1[n] = crypto_grade_random_number(0..255)
key2[n] = key[n] XOR key1[n]

আপনি আপনার বিল্ড পরিবেশে এটি করতে পারেন, এবং তারপরে কেবল স্টোর key1এবংkey2 আপনার অ্যাপ্লিকেশনটিতে।

আপনার বাইনারি রক্ষা করা

আপনার বাইনারি রক্ষা করার জন্য একটি সরঞ্জাম ব্যবহার করা অন্য পদ্ধতির। উদাহরণস্বরূপ, বেশ কয়েকটি সুরক্ষা সরঞ্জাম রয়েছে যা আপনার বাইনারিটি অস্পষ্ট হয়ে গেছে এবং এটি চালু একটি ভার্চুয়াল মেশিন শুরু করে। এটি ডিবাগ করা শক্ত (এআর) করে তোলে এবং প্রচুর বাণিজ্যিক গ্রেড সুরক্ষিত অ্যাপ্লিকেশনগুলি (এছাড়াও হায়, ম্যালওয়ার) সুরক্ষিত এটি প্রচলিত উপায়।

প্রিমিয়ার সরঞ্জামগুলির মধ্যে একটি হ'ল থেমিদা , যা আপনার বাইনারিগুলি রক্ষা করার দুর্দান্ত কাজ করে। এটি প্রায়শই বিপরীত প্রকৌশল থেকে রক্ষার জন্য স্পটিফাইয়ের মতো সুপরিচিত প্রোগ্রামগুলি দ্বারা ব্যবহৃত হয়। এটি অলিডিবিজি এবং ইডা প্রো এর মতো প্রোগ্রামগুলিতে ডিবাগিং প্রতিরোধ করার বৈশিষ্ট্যগুলি রয়েছে।

আপনার বাইনারি রক্ষার জন্য আরও কিছু বড় তালিকা, সম্ভবত কিছুটা পুরানো ।
তাদের কিছু বিনামূল্যে।

পাসওয়ার্ড মিলছে

এখানে কেউ হ্যাশিং পাসওয়ার্ড + লবণের বিষয়ে আলোচনা করেছেন।

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

শেষ পর্যন্ত, আপনি উপরের সমস্ত কৌশলগুলির সংমিশ্রণটি ব্যবহার করতে পারেন।


এটির কোনও পাসওয়ার্ড যদি ব্যবহারকারীকে প্রবেশ করতে হয় তবে পাসওয়ার্ডের হ্যাশ + লবণ সংরক্ষণ করুন। নীচে উত্তর দেখুন।

4
@ হাইপালবাশী: আপনি কীভাবে আপনার অ্যাপ্লিকেশনটিতে লবণ নিরাপদে সংরক্ষণ করবেন? আমি মনে করি না যে ওপিকে একমুখী পাসওয়ার্ড মেলানো সিস্টেমের দরকার ছিল, স্ট্যাটিক কীগুলি সংরক্ষণের একটি সাধারণ উপায়।
সিএসএল

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

4
@ কেবি - এটি একটি আকর্ষণীয় বিষয়। আমি অনুমান করছিলাম যে আপনি বিটওয়াইস এন্ডস এবং অর এর চেয়ে অনেক বেশি ঘটতে দেখবেন। a ^ b == (a & ~ b) || (~ এন্ড বি)
জেরেমি পাওয়েল

4
লবণের মান জানার ফলে প্রতিপক্ষের কোনও সুবিধা হয় না - লবণের মূল বিষয়টি হ'ল "অভিধান আক্রমণ" এড়ানো, যার ফলে আক্রমণকারী অনেকগুলি সম্ভাব্য ইনপুটগুলির জন্য হ্যাশগুলি প্রাক-গণনা করে uted লবণের সাহায্যে তাদের অভিধানকে লবণের উপর ভিত্তি করে একটি নতুনের সাথে পূর্ব-গণনা করতে বাধ্য করে। যদি প্রতিটি লবণ কেবল একবার ব্যবহার করা হয়, তবে অভিধান আক্রমণটি সম্পূর্ণ অকেজো হয়ে যায়।
এডওয়ার্ড ডিকসন

8

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

এখানে 4 টি জিনিস আপনি করতে পারেন যা আপনাকে কিছু সময়ের জন্য লুকিয়ে থাকার সম্ভাবনা বাড়িয়ে তুলবে।

1) স্ট্রিংয়ের উপাদানগুলিকে কোনও উপায়ে লুকান - অন্য স্ট্রিংয়ের সাথে স্ট্রিংটির অক্ষর (^ অপারেটর) এর মতো স্পষ্ট কিছু স্ট্রিংটিকে অনুসন্ধান করা অসম্ভব করে তুলতে যথেষ্ট ভাল হবে।

2) স্ট্রিংকে টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করা যাক এটির স্ট্রিং সহ পদ্ধতিটি অনুসন্ধান করে অনুসন্ধান করা সহজ করবেন না। অবশ্যই কিছু পদ্ধতিতে এই সমস্ত বিট কল করতে হবে, তবে এটি এখনও এটি আরও শক্ত করে তোলে।

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

4) একটি অ্যাড-হক অ্যালগরিদম করুন - এই সর্বোপরি, একটি অনন্য টুইস্ট বা দুটি যুক্ত করুন। আপনার উত্পাদিত সমস্ত কিছুতে কেবল 1 টি যুক্ত করুন, বা দুবার কোনও এনক্রিপশন করুন বা একটি চিনি যুক্ত করুন। এটি হ্যাকারের পক্ষে কিছুটা শক্ত করে তোলে যিনি ইতিমধ্যে জানেন যে কেউ যখন ব্যবহার করছেন তখন কী সন্ধান করবেন, উদাহরণস্বরূপ, ভ্যানিলা এমডি 5 হ্যাশিং বা আরএসএ এনক্রিপশন।

সর্বোপরি, নিশ্চিত করুন যে এটি কখনই গুরুত্বপূর্ণ নয় (এবং যখন আপনি অ্যাপ্লিকেশন যথেষ্ট জনপ্রিয় হয়ে উঠবেন তখনই) আপনার কীটি সন্ধান করা হবে!


5

একটি কৌশল আমি অতীতে ব্যবহার করেছি আপাতদৃষ্টিতে এলোমেলো অক্ষরের একটি অ্যারে তৈরি করা। আপনি প্রথমে সন্নিবেশ করান এবং তারপরে আপনার নির্দিষ্ট অক্ষরগুলিকে একটি বীজগণিত প্রক্রিয়া সহ সন্ধান করুন যেখানে 0 থেকে N পর্যন্ত প্রতিটি পদক্ষেপে একটি সংখ্যার <অ্যারে আকার আসবে যা আপনার অবরুদ্ধ স্ট্রিংয়ের পরবর্তী চরটি ধারণ করে। (এই উত্তরটি এখন অচল মনে হচ্ছে!)

উদাহরণ:

অক্ষরের অ্যারে দেওয়া (সংখ্যা এবং ড্যাশগুলি কেবল রেফারেন্সের জন্য)

0123456789
----------
ALFHNFELKD
LKFKFLEHGT
FLKRKLFRFK
FJFJJFJ!JL

এবং একটি সমীকরণ যার প্রথম ছয় ফলাফল: 3, 6, 7, 10, 21, 47

"হেলো!" উপরের অ্যারে থেকে


ভাল ধারণা - আমি অনুমান করি আপনি অ্যারেতে
মুদ্রণবিহীন

4

আমি @ চেকারদের সাথে একমত, আপনার এক্সিকিউটেবল বিপরীত ইঞ্জিনিয়ারড হতে পারে।

কিছুটা ভাল উপায় হ'ল এটি গতিশীলভাবে তৈরি করা, উদাহরণস্বরূপ:

std::string myKey = part1() + part2() + ... + partN();

সত্য, এটি বাইনারি অনুসন্ধান করার সময় স্ট্রিংটি প্রকাশিত হওয়া এড়ায়। যাইহোক, আপনার স্ট্রিং এখনও স্মৃতিতে বাসিন্দা .. আপনার সমাধান সম্ভবত আমি যথেষ্ট করছি যদিও, আমি যা করছি তার জন্য।
থোমি

@ থোমী, আপনি অবশ্যই এটি শেষ করার সাথে সাথেই এটি ধ্বংস করতে পারবেন । তবে এখনও, এটি সংবেদনশীল স্ট্রিং পরিচালনা করার সেরা উপায় নয় ।
নিক ডানডোলাকিস

... যেহেতু এটি ধ্বংস করা আসলে গ্যারান্টি দেয় না যে সরাসরি মেমরিটি আবার ব্যবহার করা হবে।
থোমি

4

অবশ্যই, সফ্টওয়্যারটিতে ব্যক্তিগত ডেটা সংরক্ষণ করা যা ব্যবহারকারীর কাছে প্রেরণ করা সর্বদা ঝুঁকিপূর্ণ। যে কোনও পর্যাপ্ত শিক্ষিত (এবং উত্সর্গীকৃত) প্রকৌশলী ডেটা বিপরীত করতে পারে।

বলা হচ্ছে, আপনি প্রায়শই বাধা বাড়িয়ে জিনিসগুলিকে পর্যাপ্ত সুরক্ষিত করতে পারেন যা আপনার ব্যক্তিগত ডেটা প্রকাশ করার জন্য লোকদের প্রয়োজন। এটি সাধারণত একটি ভাল আপস।

আপনার ক্ষেত্রে, আপনি অন-প্রিন্টযোগ্য ডেটা দিয়ে আপনার স্ট্রিংগুলিকে বিশৃঙ্খলা করতে পারেন, এবং তারপরে রানটাইমগুলিতে একটি সাধারণ সহায়ক ফাংশন ব্যবহার করে ডিকোড করতে পারেন:

void unscramble( char *s )
{
    for ( char *str = s + 1; *str != 0; str += 2 ) {
        *s++ = *str;
    }
    *s = '\0';
}

void f()
{
    char privateStr[] = "\001H\002e\003l\004l\005o";
    unscramble( privateStr ); // privateStr is 'Hello' now.

    string s = privateStr;
    // ...
}

4

আমি স্ট্রিংগুলির জন্য একটি সাধারণ এনক্রিপশন সরঞ্জাম তৈরি করেছি, এটি স্বয়ংক্রিয়ভাবে এনক্রিপ্ট হওয়া স্ট্রিংগুলি তৈরি করতে পারে এবং এটি করার জন্য কয়েকটি অতিরিক্ত বিকল্প রয়েছে, কয়েকটি উদাহরণ:

বিশ্বব্যাপী পরিবর্তনশীল হিসাবে স্ট্রিং:

// myKey = "mysupersupersecretpasswordthatyouwillneverguess";
unsigned char myKey[48] = { 0xCF, 0x34, 0xF8, 0x5F, 0x5C, 0x3D, 0x22, 0x13, 0xB4, 0xF3, 0x63, 0x7E, 0x6B, 0x34, 0x01, 0xB7, 0xDB, 0x89, 0x9A, 0xB5, 0x1B, 0x22, 0xD4, 0x29, 0xE6, 0x7C, 0x43, 0x0B, 0x27, 0x00, 0x91, 0x5F, 0x14, 0x39, 0xED, 0x74, 0x7D, 0x4B, 0x22, 0x04, 0x48, 0x49, 0xF1, 0x88, 0xBE, 0x29, 0x1F, 0x27 };

myKey[30] -= 0x18;
myKey[39] -= 0x8E;
myKey[3] += 0x16;
myKey[1] += 0x45;
myKey[0] ^= 0xA2;
myKey[24] += 0x8C;
myKey[44] ^= 0xDB;
myKey[15] ^= 0xC5;
myKey[7] += 0x60;
myKey[27] ^= 0x63;
myKey[37] += 0x23;
myKey[2] ^= 0x8B;
myKey[25] ^= 0x18;
myKey[12] ^= 0x18;
myKey[14] ^= 0x62;
myKey[11] ^= 0x0C;
myKey[13] += 0x31;
myKey[6] -= 0xB0;
myKey[22] ^= 0xA3;
myKey[43] += 0xED;
myKey[29] -= 0x8C;
myKey[38] ^= 0x47;
myKey[19] -= 0x54;
myKey[33] -= 0xC2;
myKey[40] += 0x1D;
myKey[20] -= 0xA8;
myKey[34] ^= 0x84;
myKey[8] += 0xC1;
myKey[28] -= 0xC6;
myKey[18] -= 0x2A;
myKey[17] -= 0x15;
myKey[4] ^= 0x2C;
myKey[9] -= 0x83;
myKey[26] += 0x31;
myKey[10] ^= 0x06;
myKey[16] += 0x8A;
myKey[42] += 0x76;
myKey[5] ^= 0x58;
myKey[23] ^= 0x46;
myKey[32] += 0x61;
myKey[41] ^= 0x3B;
myKey[31] ^= 0x30;
myKey[46] ^= 0x6C;
myKey[35] -= 0x08;
myKey[36] ^= 0x11;
myKey[45] -= 0xB6;
myKey[21] += 0x51;
myKey[47] += 0xD9;

ডিক্রিপশন লুপের সাথে ইউনিকোড স্ট্রিং হিসাবে:

// myKey = "mysupersupersecretpasswordthatyouwillneverguess";
wchar_t myKey[48];

myKey[21] = 0x00A6;
myKey[10] = 0x00B0;
myKey[29] = 0x00A1;
myKey[22] = 0x00A2;
myKey[19] = 0x00B4;
myKey[33] = 0x00A2;
myKey[0] = 0x00B8;
myKey[32] = 0x00A0;
myKey[16] = 0x00B0;
myKey[40] = 0x00B0;
myKey[4] = 0x00A5;
myKey[26] = 0x00A1;
myKey[18] = 0x00A5;
myKey[17] = 0x00A1;
myKey[8] = 0x00A0;
myKey[36] = 0x00B9;
myKey[34] = 0x00BC;
myKey[44] = 0x00B0;
myKey[30] = 0x00AC;
myKey[23] = 0x00BA;
myKey[35] = 0x00B9;
myKey[25] = 0x00B1;
myKey[6] = 0x00A7;
myKey[27] = 0x00BD;
myKey[45] = 0x00A6;
myKey[3] = 0x00A0;
myKey[28] = 0x00B4;
myKey[14] = 0x00B6;
myKey[7] = 0x00A6;
myKey[11] = 0x00A7;
myKey[13] = 0x00B0;
myKey[39] = 0x00A3;
myKey[9] = 0x00A5;
myKey[2] = 0x00A6;
myKey[24] = 0x00A7;
myKey[46] = 0x00A6;
myKey[43] = 0x00A0;
myKey[37] = 0x00BB;
myKey[41] = 0x00A7;
myKey[15] = 0x00A7;
myKey[31] = 0x00BA;
myKey[1] = 0x00AC;
myKey[47] = 0x00D5;
myKey[20] = 0x00A6;
myKey[5] = 0x00B0;
myKey[38] = 0x00B0;
myKey[42] = 0x00B2;
myKey[12] = 0x00A6;

for (unsigned int fngdouk = 0; fngdouk < 48; fngdouk++) myKey[fngdouk] ^= 0x00D5;

বিশ্বব্যাপী পরিবর্তনশীল হিসাবে স্ট্রিং:

// myKey = "mysupersupersecretpasswordthatyouwillneverguess";
unsigned char myKey[48] = { 0xAF, 0xBB, 0xB5, 0xB7, 0xB2, 0xA7, 0xB4, 0xB5, 0xB7, 0xB2, 0xA7, 0xB4, 0xB5, 0xA7, 0xA5, 0xB4, 0xA7, 0xB6, 0xB2, 0xA3, 0xB5, 0xB5, 0xB9, 0xB1, 0xB4, 0xA6, 0xB6, 0xAA, 0xA3, 0xB6, 0xBB, 0xB1, 0xB7, 0xB9, 0xAB, 0xAE, 0xAE, 0xB0, 0xA7, 0xB8, 0xA7, 0xB4, 0xA9, 0xB7, 0xA7, 0xB5, 0xB5, 0x42 };

for (unsigned int dzxykdo = 0; dzxykdo < 48; dzxykdo++) myKey[dzxykdo] -= 0x42;

4
নাহ, আমি কাজটি করতে stringencrypt.com ওয়েবসাইট ব্যবহার করেছি । এটিতে সি / সি ++ স্ট্রিনজেক্রিপ্ট. com/c-cpp- এনক্রিপশনের উদাহরণ রয়েছে যা আপনি সাধারণ স্ট্রিং এনক্রিপশনটি স্বয়ংক্রিয় করতে ব্যবহার করার বিষয়টি বিবেচনা করতে পারেন।
বার্তোস ওজিকেক

2

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

সম্পাদনা: আপনি যদি এটি করতে যাচ্ছেন তবে ক্রিসের নির্দেশিত কৌশলগুলির সংমিশ্রণটি পচা 13 এর চেয়ে অনেক ভাল।


2

যেমন আগেই বলা হয়েছিল, আপনার স্ট্রিং পুরোপুরি রক্ষা করার উপায় নেই। তবে এটির সুরক্ষার উপায় রয়েছে যুক্তিসঙ্গত সুরক্ষার জন্য।

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

অবশ্যই এটি হ্যাক হতে পারে, তবে এটি করতে কোনও দৃ determined়প্রতিজ্ঞ হ্যাকার লাগবে না।


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

1

আপনি যদি উইন্ডো ব্যবহারকারীর ডিপিএপিআইতে থাকেন তবে http://msdn.microsoft.com/en-us/library/ms995355.aspx

আগের পোস্ট হিসাবে আপনি ম্যাক থাকলে কীচেন ব্যবহার করুন।

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

এটি একটি সমাধান সমস্যা এবং উত্তরটি আপনার প্রোগ্রামের ভিতরে থাকা কীটি নয় :)


1

এই চেষ্টা করুন । উত্স কোডটি প্রদত্ত ভিজ্যুয়াল স্টুডিও সি ++ প্রকল্পে সমস্ত স্ট্রিংগুলিতে কীভাবে এনক্রিপ্ট এবং ডিক্রিপ্ট করবেন তা ব্যাখ্যা করে।


1

আমি সম্প্রতি চেষ্টা করা একটি পদ্ধতি হ'ল:

  1. ব্যক্তিগত ডেটাটির হ্যাশ (SHA256) নিন এবং কোড হিসাবে এটি পপুলেট করুন part1
  2. ব্যক্তিগত ডেটা এবং এর হ্যাশগুলির এক্সওআর নিন এবং কোড হিসাবে এটি পপুলেট করুন part2
  3. ডেটা পপুলেট করুন: এটিকে চর টিআরটি [] হিসাবে সংরক্ষণ করবেন না, তবে অ্যাসাইনমেন্ট নির্দেশাবলী ব্যবহার করে রানটাইমগুলিতে বসান (নীচে ম্যাক্রোতে দেখানো হয়েছে)
  4. এখন, এক্সওআর part1এবং এর এক্সআর করে রান চালানোর সময় ব্যক্তিগত ডেটা তৈরি করুনpart2
  5. অতিরিক্ত পদক্ষেপ : উত্পন্ন ডেটার হ্যাশ গণনা করুন এবং এর সাথে তুলনা করুন part1। এটি ব্যক্তিগত ডেটাগুলির অখণ্ডতা যাচাই করবে।

ডেটা পপুলেশন করতে ম্যাক্রো:

ধরা যাক, ব্যক্তিগত ডেটা 4 বাইটের আমরা এর জন্য একটি ম্যাক্রো সংজ্ঞায়িত করি যা কিছু এলোমেলো ক্রমে অ্যাসাইনমেন্ট নির্দেশাবলী সহ ডেটা সংরক্ষণ করে।

#define POPULATE_DATA(str, i0, i1, i2, i3)\
{\
    char *p = str;\
    p[3] = i3;\
    p[2] = i2;\
    p[0] = i0;\
    p[1] = i1;\
}

এখন এই ম্যাক্রোটি কোডে ব্যবহার করুন যেখানে আপনাকে সংরক্ষণ করতে হবে part1এবং নীচে part2:

char part1[4] = {0};
char part2[4] = {0};
POPULATE_DATA(part1, 1, 2, 3, 4); 
POPULATE_DATA(part2, 5, 6, 7, 8);

1

কেবলমাত্র একটি (খুব হালকা) শিরোনাম-প্রজেক্ট অপ্রচলিত যে ঠিকভাবে কাজ adamyaxley দ্বারা তৈরি। এটি ল্যাম্বদা ফাংশন এবং ম্যাক্রোগুলির উপর ভিত্তি করে এবং এটি সংকলন সময়ে একটি এক্সওআর সাইফারের সাহায্যে স্ট্রিং লিটারেরাল এনক্রিপ্ট করে। প্রয়োজনে আমরা প্রতিটি স্ট্রিংয়ের জন্য বীজ পরিবর্তন করতে পারি।

নিম্নলিখিত কোডগুলি সংকলিত বাইনারিটিতে "হ্যালো ওয়ার্ল্ড" স্ট্রিং সংরক্ষণ করবে না।

#include "obfuscate.h"

int main()
{
  std::cout << AY_OBFUSCATE("Hello World") << std::endl;
  return 0;
}

আমি সি ++ 17 এবং ভিজ্যুয়াল স্টুডিও 2019 দিয়ে পরীক্ষা করেছি এবং আইডিএর মাধ্যমে চেক করেছি এবং আমি নিশ্চিত করেছি যে স্ট্রিংটি লুকানো রয়েছে। ADVobfuscator এর তুলনায় একটি মূল্যবান সুবিধা হ'ল এটি একটি স্টাডি :: স্ট্রিংয়ে রূপান্তরযোগ্য (এখনও সংকলিত বাইনারিতে লুকিয়ে থাকা অবস্থায়):

std::string var = AY_OBFUSCATE("string");

0

আপনার এক্সিকিউটেবলে প্রাইভেট কী সংরক্ষণ করার পরিবর্তে, আপনি এটি ব্যবহারকারীর কাছ থেকে অনুরোধ করতে এবং কোনও বাহ্যিক পাসওয়ার্ড ম্যানেজারের মাধ্যমে ম্যাক ওএস এক্স কিচেন অ্যাক্সেসের অনুরূপ কিছু সঞ্চয় করতে চাইতে পারেন ।


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

যদি এটি নিরাপত্তাহীনতা বোধ করে (তবে আপনার স্পষ্টতা দেওয়া হলেও এটি যথেষ্ট পর্যাপ্ত) আপনি একটি

0

প্রসঙ্গ নির্ভরশীল তবে আপনি কেবল কী এর হ্যাশ প্লাস একটি লবণ সংরক্ষণ করতে পারেন (ধ্রুব স্ট্রিং, অস্পষ্ট করার পক্ষে সহজ) সংরক্ষণ করতে পারেন।

তারপরে (যদি) ব্যবহারকারী কীটিতে প্রবেশ করে, আপনি লবণ যুক্ত করুন , হ্যাশ গণনা করুন এবং তুলনা করুন।

লবণ সম্ভবত এই ক্ষেত্রে অপ্রয়োজনীয়, এটি একটি বলপূর্বক অভিধান হামলা স্টপ যদি হ্যাশ বিচ্ছিন্ন করা যেতে পারে (একটি Google অনুসন্ধান এছাড়াও কাজ জানেন হয়েছে)।

একটি হ্যাকার এখনও পুরো লম্বা বাইপাস করতে কোথাও একটি জ্যাম্প নির্দেশিকা সন্নিবেশ করতে হবে, তবে এটি একটি সাধারণ পাঠ্য অনুসন্ধানের চেয়ে আরও জটিল।


এটি একটি এনক্রিপশন কী, কোনও পাসওয়ার্ড হ্যাশ নয়। ডেটা এনকোড এবং ডিকোড করার জন্য আমার আসল কীটি দরকার। ব্যবহারকারী কখনই কীটি দেখতে পায় না, এটি বাইনারিগুলির বাইরে কখনও সংরক্ষণ করা হয় না।
থোমি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.