সিকিউরস্ট্রিং কি কোনও সি # অ্যাপ্লিকেশনটিতে কখনও ব্যবহারিক?


224

এখানে আমার অনুমানগুলি ভুল হলে আমাকে সংশোধন করতে দ্বিধা বোধ করবেন তবে আমি কেন জিজ্ঞাসা করছি তা আমাকে ব্যাখ্যা করতে দিন।

এমএসডিএন থেকে নেওয়া SecureString:

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

আমি এটি পেয়েছি, এটি একটি SecureStringওভারের মধ্যে একটি পাসওয়ার্ড বা অন্যান্য ব্যক্তিগত তথ্য সংরক্ষণ করার সম্পূর্ণ জ্ঞান করে System.String, কারণ আপনি কখন এবং কখন এটি মেমরিতে প্রকৃতপক্ষে সংরক্ষণ করতে পারেন তা নিয়ন্ত্রণ করতে পারেন কারণ System.String:

উভয়ই অপরিবর্তনীয় এবং যখন আর প্রয়োজন হয় না, তখন আবর্জনা সংগ্রহের জন্য প্রোগ্রামিকভাবে নির্ধারিত করা যায় না; এটি হ'ল, উদাহরণটি তৈরি হওয়ার পরে কেবল পঠনযোগ্য এবং কম্পিউটার মেমরি থেকে উদাহরণটি কখন মুছে ফেলা হবে তা অনুমান করা যায় না। ফলস্বরূপ, যদি কোনও স্ট্রিং অবজেক্টে সংবেদনশীল তথ্য যেমন পাসওয়ার্ড, ক্রেডিট কার্ড নম্বর, বা ব্যক্তিগত ডেটা থাকে তবে তথ্য ব্যবহার করার পরে এটি প্রকাশের ঝুঁকি রয়েছে কারণ আপনার অ্যাপ্লিকেশনটি কম্পিউটারের স্মৃতি থেকে ডেটা মুছতে পারে না।

তবে জিইউআই অ্যাপ্লিকেশন (উদাহরণস্বরূপ, একটি এসএসএস ক্লায়েন্ট) SecureString এর ক্ষেত্রে এটিকে একটি থেকে তৈরি করতে হবে System.String । সমস্ত পাঠ্য নিয়ন্ত্রণগুলি এর স্ট্রিংটিকে এর অন্তর্নিহিত ডেটা টাইপ হিসাবে ব্যবহার করে

সুতরাং, এর অর্থ হ'ল প্রতিবার ব্যবহারকারী কোনও কী চাপলে সেখানে পুরানো স্ট্রিংটি ফেলে দেওয়া হয় এবং পাঠ্য বাক্সের অভ্যন্তরে কী মান হয় তা উপস্থাপন করতে একটি নতুন স্ট্রিং তৈরি করা হয়, এমনকি পাসওয়ার্ড মাস্ক ব্যবহার করা হলেও। এবং আমরা মান রাখতে পারি না যখন সেগুলির কোনও মান মেমরি থেকে বাদ দেওয়া হয়

এখন এটি সার্ভারে লগ ইন করার সময়। কি অনুমান? প্রমাণীকরণের জন্য আপনাকে সংযোগের উপরে একটি স্ট্রিং পাস করতে হবে । সুতরাং আসুন আমাদের SecureStringএকটি System.String.... তে রূপান্তর করুন এবং এখন আমাদের স্তূপের স্ট্রিং রয়েছে যাতে কোনও জঞ্জাল সংগ্রহের মধ্য দিয়ে যেতে বাধ্য করা যায় না (বা এর বাফারে 0 টি লিখুন)।

আমার বিন্দু : কোন ব্যাপার আপনি কি করবেন, লাইন বরাবর কোথাও, যে SecureStringহয় যাচ্ছে একটি রূপান্তরিত করা System.String, এটা অর্থ কিছু সময়ে গাদা উপর অন্তত থাকবেই দিকে (গার্বেজ কালেকশন কোনো নিশ্চয়তা ছাড়াই) হবে।

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

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

দুঃখিত যদি আমি প্রশ্নগুলি খুব ঘন উপর রাখি, কৌতূহল আমার চেয়ে আরও ভাল হয়েছে। আমার যেকোন বা সমস্ত প্রশ্নের উত্তর নির্দ্বিধায় (অথবা আমাকে বলুন যে আমার অনুমানগুলি সম্পূর্ণ ভুল)। :)


25
মনে রাখবেন যে SecureStringআসলেই কোনও সুরক্ষিত স্ট্রিং নয়। এটি কেবলমাত্র সময় উইন্ডো হ্রাস করার একটি উপায় যার মধ্যে কেউ আপনার স্মৃতি পরীক্ষা করতে পারে এবং সফলভাবে সংবেদনশীল ডেটা পেতে পারে। এটি বুলেটপ্রুফ নয় এবং এটির উদ্দেশ্য ছিল না। তবে আপনি যে পয়েন্টগুলি উত্থাপন করছেন তা খুব কার্যকর। সম্পর্কিত: স্ট্যাকওভারফ্লো.
com/ প্রশ্নগুলি

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

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

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

1
সিকিউরস্ট্রিং একটি সুরক্ষা গভীর-কৌশল। উন্নয়ন ব্যয় এবং সুরক্ষা লাভের মধ্যে বাণিজ্য বেশিরভাগ পরিস্থিতিতে অনুকূল নয়। এটির জন্য খুব ভাল ব্যবহারের কেস খুব কমই আছে।
usr ডিরেক্টরির

উত্তর:


237

এর আসলে ব্যবহারিক ব্যবহার রয়েছে SecureString

আপনি কি জানেন যে আমি কতবার এমন দৃশ্য দেখেছি? (উত্তরটি অনেকগুলি!):

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

আপনি কি জানেন যে এই সমস্ত সমস্যা এড়ানো যায়? SecureString। এটি সাধারণত নিশ্চিত করে যে আপনি এর মতো মূর্খ ভুল করবেন না। কীভাবে এড়ানো যায়? নিশ্চিত না করে যে পাসওয়ার্ডটি নিয়ন্ত্রণহীন মেমরিতে এনক্রিপ্ট করা হয়েছে এবং আপনি যখন করছেন তখন 90% নিশ্চিত হয়ে গেলেই আসল মানটি অ্যাক্সেস করা যায়।

অর্থে, SecureStringখুব সহজে কাজ করে:

1) সবকিছু এনক্রিপ্ট করা হয়

2) ব্যবহারকারী কল AppendChar

3) অবিশ্রুত স্মৃতিতে সবকিছু ডিক্রিপ্ট করুন এবং চরিত্রটি যুক্ত করুন

4) পরিচালনাবিহীন স্মরণে আবার সবকিছু এনক্রিপ্ট করুন।

যদি ব্যবহারকারীর আপনার কম্পিউটারে অ্যাক্সেস থাকে? একটি ভাইরাস সমস্ত অ্যাক্সেস পেতে সক্ষম হবে SecureStrings? হ্যাঁ. RtlEncryptMemoryমেমরিটি ডিক্রিপ্ট হওয়ার সময় আপনার যা যা করা দরকার তা হ'ল আপনি এনক্রিপ্ট করা মেমরির ঠিকানাটি পেয়ে যাবেন এবং তা পড়তে পারবেন। ভাল খবর! আসলে, আপনি এমন একটি ভাইরাস তৈরি করতে পারেন যা ব্যবহারের জন্য ক্রমাগত স্ক্যান করে SecureStringএবং এর সাথে সমস্ত ক্রিয়াকলাপ লগ করে তুলবে । আমি বলছি না এটি একটি সহজ কাজ হবে, তবে এটি করা যেতে পারে। আপনারা যেমন দেখতে পাচ্ছেন, SecureStringআপনার সিস্টেমে কোনও ব্যবহারকারী / ভাইরাস আসার পরে "শক্তিশালীতা" পুরোপুরি চলে যায়।

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

এছাড়াও, যেমন অন্যরা লক্ষ করেছেন, ডাব্লুপিএফ পাসওয়ার্ডবক্সকে সমর্থন করে যা SecureStringএর সিকিওরপাসওয়ার্ড সম্পত্তি দ্বারা অভ্যন্তরীণভাবে ব্যবহার করে

নীচের লাইনটি হ'ল; আপনার যদি সংবেদনশীল ডেটা থাকে (পাসওয়ার্ড, ক্রেডিট কার্ড, ..), ব্যবহার করুন SecureString। এটি সি # ফ্রেমওয়ার্ক অনুসরণ করছে। উদাহরণস্বরূপ, NetworkCredentialশ্রেণি পাসওয়ার্ড হিসাবে সংরক্ষণ করে SecureString। আপনি তাকান তাহলে এই , আপনি .NET কাঠামোর মধ্যে ~ 80 বিভিন্ন ব্যবহারগুলির উপর দেখতে পারেন SecureString

SecureStringআপনি স্ট্রিংতে রূপান্তর করতে হবে এমন অনেকগুলি মামলা রয়েছে কারণ কিছু এপিআই এটি প্রত্যাশা করে।

স্বাভাবিক সমস্যা হয়:

  1. এপিআই হ'ল জেনেরিক। এটি জানে না যে একটি সংবেদনশীল ডেটা রয়েছে।
  2. এপিআই জানে যে এটি সংবেদনশীল ডেটা নিয়ে কাজ করে এবং "স্ট্রিং" ব্যবহার করে - এটি কেবল খারাপ ডিজাইন।

আপনি ভাল বক্তব্য উত্থাপিত: যখন SecureStringরূপান্তরিত হয় তখন কি হয় string? এটি কেবল প্রথম পয়েন্টের কারণে ঘটতে পারে। যেমন এপিআই জানেন না যে এটি সংবেদনশীল ডেটা। আমি ব্যক্তিগতভাবে তা ঘটতে দেখিনি। সিকিউরস্ট্রিংয়ের বাইরে স্ট্রিং পাওয়া এত সহজ নয়।

এটি একটি সাধারণ কারণে সহজ নয় ; ব্যবহারকারী কখনই সিকিউরস্ট্রিংকে স্ট্রিংয়ে রূপান্তর করতে দেবেন না, যেমনটি আপনি বলেছেন: জিসি লাথি মারবে। আপনি যদি নিজেকে এটি করতে দেখেন তবে আপনাকে পিছনে ফিরে নিজেকে জিজ্ঞাসা করতে হবে: আমি এমনকি কেন এটি করছি, বা আমার সত্যিই কী প্রয়োজন এই, কেন?

আমি দেখেছি একটি আকর্ষণীয় ঘটনা আছে। যথা, উইনএপি ফাংশন লগনউসার এলপিটিআরটিএসকে একটি পাসওয়ার্ড হিসাবে গ্রহণ করে যার অর্থ আপনার কল করা দরকার SecureStringToGlobalAllocUnicode। এটি মূলত আপনাকে আনইনক্রিপ্ট করা পাসওয়ার্ড দেয় যা নিয়ন্ত্রণহীন মেমরিতে বাস করে। আপনার কাজ শেষ হওয়ার সাথে সাথে আপনাকে এ থেকে মুক্তি দিতে হবে:

// Marshal the SecureString to unmanaged memory.
IntPtr rawPassword = Marshal.SecureStringToGlobalAllocUnicode(password);
try
{
   //...snip...
}
finally 
{
   // Zero-out and free the unmanaged string reference.
   Marshal.ZeroFreeGlobalAllocUnicode(rawPassword);
}

আপনি সর্বদা SecureStringএক্সটেনশন পদ্ধতি সহ ক্লাসটি প্রসারিত করতে পারেন , যেমন সার্ভারের সর্বজনীন কী ব্যবহার করে এনক্রিপ্ট করা হয়েছে এর ToEncryptedString(__SERVER__PUBLIC_KEY)একটি stringউদাহরণ দেয় SecureString। কেবলমাত্র সার্ভারই ​​এটি ডিক্রিপ্ট করতে পারে। সমস্যার সমাধান: আবর্জনা সংগ্রহ কখনই "আসল" স্ট্রিংটি দেখতে পাবে না, কারণ আপনি এটি কখনই পরিচালিত মেমোরিতে প্রকাশ করেন না। PSRemotingCryptoHelper( EncryptSecureStringCore(SecureString secureString)) এর মধ্যে ঠিক এটি করা হচ্ছে ।

এবং খুব প্রায় সম্পর্কিত কিছু হিসাবে: মনো সিকিউরস্ট্রিং মোটেও এনক্রিপ্ট করে না । বাস্তবায়নটি মন্তব্য করা হয়েছে কারণ এটির জন্য অপেক্ষা করুন .. "এটি কোনওভাবে নুনিট পরীক্ষার বিরতি সৃষ্টি করে" , যা আমার শেষ পয়েন্টে নিয়ে আসে:

SecureStringসর্বত্র সমর্থিত নয়। প্ল্যাটফর্ম / আর্কিটেকচার সমর্থন না করে SecureString, আপনি একটি ব্যতিক্রম পাবেন। প্ল্যাটফর্মগুলির একটি তালিকা রয়েছে যা ডকুমেন্টেশনে সমর্থিত।


আমি মনে করি যদি এর স্বতন্ত্র চরিত্রগুলিতে অ্যাক্সেসের ব্যবস্থা থাকত তবে SecureStringঅনেক বেশি ব্যবহারিক হবে। এই জাতীয় ব্যবস্থার জন্য দক্ষতা SecureStringTempBufferকোনও জনসাধারণের সদস্য না করে কাঠামোর ধরণ থাকার মাধ্যমে বাড়ানো যেতে পারে , যা "একটি অক্ষর পড়ুন" পদ্ধতিতে প্রেরণ করা refযায় SecureString[যদি 8-বর্ণচিহ্নগুলিতে এনক্রিপশন / ডিক্রিপশন প্রক্রিয়া করা হয়, যেমন একটি কাঠামো ডেটা ধারণ করতে পারে 8 টি অক্ষরের জন্য এবং SecureString] এর মধ্যে এই অক্ষরের প্রথমটির অবস্থান ] for
সুপারক্যাট

2
আমি সম্পাদিত প্রতিটি উত্স কোড নিরীক্ষায় এটি পতাকাঙ্কিত করি। এটিও পুনরাবৃত্তি করা উচিত যে আপনি যদি SecureStringএটি ব্যবহার করেন তবে এটি স্ট্যাকের মাধ্যমে সমস্ত উপায়ে ব্যবহার করা দরকার।
কেসি

1
আমি .ToEncryptedString () এক্সটেনশনটি প্রয়োগ করেছি তবে শংসাপত্র ব্যবহার করে। আপনার কি একবার নজর দেওয়া উচিত এবং যদি আমি এই সমস্ত ভুল করে চলেছি তবে আমাকে জানান। তার নিরাপদ engouhg প্রত্যাশী আমি ভালো gist.github.com/sturlath/99cfbfff26e0ebd12ea73316d0843330
Sturla

@ স্টুরলা - EngineSettingsআপনার সম্প্রসারণ পদ্ধতিতে কী আছে?
ইনটেক্সএক্স


15

আপনার অনুমানের মধ্যে কয়েকটি ইস্যু।

সবার আগে সিকিওরস্ট্রিং ক্লাসে স্ট্রিং কনস্ট্রাক্টর নেই। একটি তৈরি করার জন্য আপনি একটি অবজেক্ট বরাদ্দ করুন এবং তারপরে অক্ষর যুক্ত করুন।

জিইউআই বা কনসোলের ক্ষেত্রে, আপনি খুব সহজেই প্রতিটি চাপানো কী একটি নিরাপদ স্ট্রিংয়ে দিতে পারেন।

ক্লাসটি এমনভাবে ডিজাইন করা হয়েছে যাতে আপনি ভুল করে স্টোর করা মানটি অ্যাক্সেস করতে পারবেন না। এর অর্থ হ'ল আপনি stringএটি থেকে সরাসরি পাসওয়ার্ড হিসাবে প্রাপ্ত করতে পারবেন না ।

সুতরাং এটি ব্যবহারের জন্য, উদাহরণস্বরূপ, ওয়েবের মাধ্যমে প্রমাণীকরণের জন্য, আপনাকে যথাযথ ক্লাসগুলি ব্যবহার করতে হবে যা নিরাপদ।

.NET ফ্রেমওয়ার্কে আপনার কয়েকটি ক্লাস রয়েছে যা সিকিওরস্ট্রিং ব্যবহার করতে পারে

  • ডাব্লুপিএফ এর পাসওয়ার্ডবক্স নিয়ন্ত্রণ পাসওয়ার্ডটি একটি অভ্যন্তরীণভাবে সুরক্ষিত স্ট্রিং হিসাবে রাখে।
  • System.Diagnostics.ProcessInfo এর পাসওয়ার্ড সম্পত্তি একটি সিকিউরস্ট্রিং।
  • এক্স 509 সার্টিফেট 2 এর কনস্ট্রাক্টর পাসওয়ার্ডের জন্য একটি সিকিউরস্ট্রিং নেয়।

(আরও)

উপসংহারে, সিকিউরস্ট্রিং শ্রেণিটি দরকারী হতে পারে তবে বিকাশকারীদের আরও মনোযোগ প্রয়োজন requires

এমএসডিএন এর সিকিউরস্ট্রিংয়ের ডকুমেন্টেশনগুলিতে উদাহরণ সহ এগুলি সমস্ত বর্ণনা করা হয়েছে


10
আমি আপনার উত্তরের তৃতীয় থেকে শেষ অনুচ্ছেদটি বেশ বুঝতে পারি না। আপনি কীভাবেSecureString নেটওয়ার্কটিকে কোনও এটিকে সিরিয়াল না করে স্থানান্তর করবেন string? আমি মনে করি প্রশ্নের ওপির বক্তব্যটি এমন এক সময় আসবে যখন আপনি আসলে একটিতে নিরাপদে রাখা মানটি ব্যবহার করতে চান SecureString, যার অর্থ আপনাকে সেখান থেকে বের করে আনতে হবে এবং এটি আর নিরাপদ নয়। ফ্রেমওয়ার্ক ক্লাস লাইব্রেরির সমস্ত ক্ষেত্রে, কার্যত এমন কোনও পদ্ধতি নেই যা SecureStringসরাসরি কোনও ইনপুট হিসাবে গ্রহণ করে (যতদূর আমি দেখতে পাচ্ছি), সুতরাং SecureStringপ্রথম স্থানে কোনও মানটির ভিতরে রাখার বিন্দুটি কী ?
স্টাকেক্স -

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

1
@ স্টাকেক্স আপনি char[]প্রতিটি charসকেটের মাধ্যমে এবং প্রতিটি প্রেরণে কোনও জঞ্জাল সংগ্রহযোগ্য বস্তু তৈরি না করে নেটওয়ার্কে এটি প্রেরণ করবেন ।
ব্যবহারকারী 253751

চর [] সংগ্রহযোগ্য এবং পরিবর্তনীয়, তাই এটি ওভাররাইট করা যায়।
পিটার রিচি

অবশ্যই, সেই অ্যারে ওভাররাইট করা ভুলে যাওয়া সহজ। যে কোনও উপায়ে, আপনি যে অক্ষরগুলি অক্ষরটি পাস করেছেন তা কোনও অনুলিপিও তৈরি করতে পারে।
সিএওও

10

একটি সিকিউরস্ট্রিং দরকারী যদি:

  • আপনি এটি অক্ষর দ্বারা অক্ষর তৈরি করেন (উদাহরণস্বরূপ কনসোল ইনপুট থেকে) বা এটি পরিচালনা না করা API থেকে পান

  • আপনি এটি পরিচালনা না করে থাকা API (SecureStringToBSTR) এ দিয়ে দিয়ে ব্যবহার করুন passing

আপনি যদি কখনও এটিকে কোনও পরিচালিত স্ট্রিংয়ে রূপান্তর করেন তবে আপনি এর উদ্দেশ্যকে পরাস্ত করেছেন।

মন্তব্যের জবাবে আপডেট করুন

... বা আপনার মতো বিএসটিআর উল্লেখ করেছেন, যা আর নিরাপদ বলে মনে হয় না

এটি একটি বিএসটিআরে রূপান্তরিত হওয়ার পরে, বিআরটিআর গ্রহণকারী পরিচালনা করা অব্যবহৃত উপাদানগুলি স্মৃতিশক্তি শূন্য করতে পারে। পরিচালনা না করা মেমরি আরও সুরক্ষিত যে এই উপায়ে এটি পুনরায় সেট করা যায়।

যাইহোক, .NET ফ্রেমওয়ার্কে খুব কম, এপিআই রয়েছে যা সিকিউরস্ট্রিং সমর্থন করে, তাই আপনি ঠিক বলেছেন যে এটির আজ খুব সীমাবদ্ধ মূল্য রয়েছে।

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

কোনও সার্ভার অ্যাপ্লিকেশনটিতে এটি কোথায় কার্যকর হবে তা দেখা শক্ত।

আপডেট 2

একটি সিকিউরস্ট্রিং গ্রহণ করে এমন একটি নেট নেটওয়ার্কের একটি উদাহরণ হ'ল X509 সার্টিফিকেট শ্রেণীর জন্য এই নির্মাতা । আপনি যদি আইএলএসপি বা এর অনুরূপ স্পেলিং করেন তবে আপনি দেখতে পাবেন যে সিকিউরস্ট্রিং অভ্যন্তরীণভাবে একটি অপরিকল্পিত বাফারে রূপান্তরিত হয়েছে ( Marshal.SecureStringToGlobalAllocUnicode), যা পরে শূন্য হয় ( Marshal.ZeroFreeGlobalAllocUnicode) দিয়ে শেষ করার পরে ।


1
+1, তবে আপনি কি সর্বদা "এর উদ্দেশ্যকে পরাস্ত করে" শেষ করবেন না? ফ্রেমওয়ার্ক ক্লাস লাইব্রেরিতে প্রায় কোনও পদ্ধতিই কোনও SecureStringইনপুট হিসাবে গ্রহণ করে না, তাদের ব্যবহার কী হবে? আপনাকে সর্বদা stringশিগগিরই শীঘ্রই বা পরে রূপান্তর করতে হবে (বা BSTRআপনি উল্লেখ করেছেন এমনটি যা কোনওরকম সুরক্ষিত বলে মনে হয় না)। তাহলে কেন একেবারেই বিরক্ত করবেন SecureString?
স্টাকাক্স -

5

মাইক্রোসফ্ট SecureStringনতুন কোডগুলির জন্য ব্যবহার করার পরামর্শ দেয় না ।

সিকিউরস্ট্রিং ক্লাসের ডকুমেন্টেশন থেকে :

গুরুত্বপূর্ণ

আমরা আপনাকে SecureStringনতুন বিকাশের জন্য ক্লাসটি ব্যবহার করার পরামর্শ দিচ্ছি না । আরও তথ্যের জন্য, দেখুন SecureStringব্যবহার করা উচিত নয়

যা সুপারিশ করে:

SecureStringনতুন কোডের জন্য ব্যবহার করবেন না । .NET কোর-এ কোড পোর্ট করার সময় বিবেচনা করুন যে অ্যারের সামগ্রীগুলি মেমরিতে এনক্রিপ্ট করা হয়নি।

শংসাপত্রাদি নিয়ে কাজ করার সাধারণ পদ্ধতির হ'ল এগুলি এড়ানো এবং পরিবর্তে শংসাপত্র বা উইন্ডোজ প্রমাণীকরণের মতো প্রমাণীকরণের জন্য অন্যান্য উপায়গুলির উপর নির্ভর করা। গিটহাবে


4

আপনি যেমন সঠিকভাবে চিহ্নিত করেছেন, তার থেকে SecureStringএকটি নির্দিষ্ট সুবিধা উপলব্ধ করা হয় string: নিরোধক ক্ষয় ras এই সত্যের সাথে দুটি সমস্যা রয়েছে:

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

সুতরাং, আপনি কখন এটি ব্যবহার করা উচিত? আপনি যখন এমন কোনও কিছু নিয়ে কাজ করছেন যা আপনাকে SecureStringআপনার সমস্ত প্রয়োজনের সাথে কাজ করতে দেয় এবং তারপরেও আপনার এখনও মনে রাখা উচিত যে এটি কেবল নির্দিষ্ট পরিস্থিতিতে সুরক্ষিত।


2
আপনি ধরে নিচ্ছেন যে কোনও আক্রমণকারী কোনও নির্দিষ্ট সময়ে কোনও প্রক্রিয়ার স্মৃতি স্ন্যাপশট করতে সক্ষম। অগত্যা ঘটনাটি নয়। ক্র্যাশ ডাম্প বিবেচনা করুন। সংবেদনশীল ডেটা দিয়ে অ্যাপ্লিকেশনটি করার পরে যদি ক্র্যাশ ঘটে তবে ক্র্যাশ ডাম্পের সংবেদনশীল ডেটা থাকা উচিত নয়।

4

নীচের পাঠ্যটি স্ট্যাটিক কোড বিশ্লেষককে শক্তিশালী করে এইচপি থেকে অনুলিপি করা হয়েছে

বিমূর্ততা: PassGenerator.cs- এ পদ্ধতিটি পাসস্ট্রিং () স্ট্রাইভের সংবেদনশীল তথ্যগুলিকে একটি সুরক্ষিত উপায়ে (যেমন স্ট্রিংয়ে) সঞ্চয় করে, গাদা পরিদর্শন করার মাধ্যমে ডেটা উত্তোলন করা সম্ভব করে।

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

প্রস্তাবনা: স্ট্রিংয়ের মতো সামগ্রীতে সংবেদনশীল ডেটা সঞ্চয় করার পরিবর্তে সেগুলি সিকিউরস্ট্রিং অবজেক্টে রেখে দিন। প্রতিটি বস্তু এর সামগ্রীগুলি সর্বদা স্মৃতিতে একটি এনক্রিপ্ট করা বিন্যাসে সঞ্চয় করে।


3

আমি এই বিষয়টি সম্বোধন করতে চাই:

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

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

হার্টব্লিডের ফাঁস মেমরি

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

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

যাইহোক, জিইউআই ব্যবহারের জন্য প্রোগ্রাম করা যেতে পারে SecureStringএবং এই ক্ষেত্রে মেমরিতে পাসওয়ার্ডের উপলব্ধতার উইন্ডো হ্রাস করা উপযুক্ত worth উদাহরণস্বরূপ, ডাব্লুপিএফ থেকে পাসওয়ার্ডবক্স.সিকিউরপ্যাসওয়ার্ড টাইপযুক্ত SecureString


হুঁ, নিশ্চিতভাবে জানতে আগ্রহী। সমস্ত সততার সাথে, আমি এমনকি এমন কোনও সিস্টেমের জন্য আক্রমণের ধরণের সম্পর্কে উদ্বিগ্ন নই। আমার স্মৃতি থেকে স্ট্রিংয়ের মানটি আমি খাঁটি কৌতূহল থেকে জিজ্ঞাসা করছি। তবে তথ্যের জন্য ধন্যবাদ! :)
স্টিভেন জেফরিস

2

কিছু সময় আগে আমাকে জাভা ক্রেডিট কার্ড পেমেন্ট গেটওয়ের বিপরীতে এসি # ইন্টারফেস তৈরি করতে হয়েছিল এবং একটির জন্য একটি সুসংগত সুরক্ষিত যোগাযোগ কী এনক্রিপশন প্রয়োজন। যেহেতু জাভা বাস্তবায়ন বরং নির্দিষ্ট ছিল এবং আমাকে একটি নির্দিষ্ট উপায়ে সুরক্ষিত ডেটা নিয়ে কাজ করতে হয়েছিল।

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

namespace Cardinity.Infrastructure
{
    using System.Security.Cryptography;
    using System;
    enum EncryptionMethods
    {
        None=0,
        HMACSHA1,
        HMACSHA256,
        HMACSHA384,
        HMACSHA512,
        HMACMD5
    }


internal class Protected
{
    private  Byte[] salt = Guid.NewGuid().ToByteArray();

    protected byte[] Protect(byte[] data)
    {
        try
        {
            return ProtectedData.Protect(data, salt, DataProtectionScope.CurrentUser);
        }
        catch (CryptographicException)//no reason for hackers to know it failed
        {
#if DEBUG
            throw;
#else
            return null;
#endif
        }
    }

    protected byte[] Unprotect(byte[] data)
    {
        try
        {
            return ProtectedData.Unprotect(data, salt, DataProtectionScope.CurrentUser);
        }
        catch (CryptographicException)//no reason for hackers to know it failed
        {
#if DEBUG
            throw;
#else
            return null;
#endif
        }
    }
}


    internal class SecretKeySpec:Protected,IDisposable
    {
        readonly EncryptionMethods _method;

        private byte[] _secretKey;
        public SecretKeySpec(byte[] secretKey, EncryptionMethods encryptionMethod)
        {
            _secretKey = Protect(secretKey);
            _method = encryptionMethod;
        }

        public EncryptionMethods Method => _method;
        public byte[] SecretKey => Unprotect( _secretKey);

        public void Dispose()
        {
            if (_secretKey == null)
                return;
            //overwrite array memory
            for (int i = 0; i < _secretKey.Length; i++)
            {
                _secretKey[i] = 0;
            }

            //set-null
            _secretKey = null;
        }
        ~SecretKeySpec()
        {
            Dispose();
        }
    }

    internal class Mac : Protected,IDisposable
    {
        byte[] rawHmac;
        HMAC mac;
        public Mac(SecretKeySpec key, string data)
        {

            switch (key.Method)
            {
                case EncryptionMethods.HMACMD5:
                    mac = new HMACMD5(key.SecretKey);
                    break;
                case EncryptionMethods.HMACSHA512:
                    mac = new HMACSHA512(key.SecretKey);
                    break;
                case EncryptionMethods.HMACSHA384:
                    mac = new HMACSHA384(key.SecretKey);
                    break;
                case EncryptionMethods.HMACSHA256:
                    mac = new HMACSHA256(key.SecretKey);

                break;
                case EncryptionMethods.HMACSHA1:
                    mac = new HMACSHA1(key.SecretKey);
                    break;

                default:                    
                    throw new NotSupportedException("not supported HMAC");
            }
            rawHmac = Protect( mac.ComputeHash(Cardinity.ENCODING.GetBytes(data)));            

        }

        public string AsBase64()
        {
            return System.Convert.ToBase64String(Unprotect(rawHmac));
        }

        public void Dispose()
        {
            if (rawHmac != null)
            {
                //overwrite memory address
                for (int i = 0; i < rawHmac.Length; i++)
                {
                    rawHmac[i] = 0;
                }

                //release memory now
                rawHmac = null;

            }
            mac?.Dispose();
            mac = null;

        }
        ~Mac()
        {
            Dispose();
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.