সংক্ষিপ্ত উত্তর
কেন আমি শুধু বলতে পারি না:
SecureString password = new SecureString("password");
কারণ এখন আপনার password
স্মৃতি আছে; এটি মুছানোর কোনও উপায় ছাড়াই - যা সিকিউরস্ট্রিংয়ের ঠিক বিন্দু ।
দীর্ঘ উত্তর
কারণ SecureString কারণ আপনার ব্যবহার করতে পারবেন না বিদ্যমান ZeroMemory সংবেদনশীল তথ্য মুছা যখন আপনি এটি দিয়ে কাজ সম্পন্ন হয়। এটি সিএলআর কারণে বিদ্যমান একটি সমস্যা সমাধানের জন্য বিদ্যমান ।
একটি নিয়মিত নেটিভ অ্যাপ্লিকেশন আপনি কল করতে হবে SecureZeroMemory
:
জিরো দিয়ে মেমরির একটি ব্লক পূরণ করে।
দ্রষ্টব্য : সিকিউর জিরো মেমরিটি সমান ZeroMemory
, সংকলক ব্যতীত এটি অপ্টিমাইজ করবে না except
সমস্যাটি হ'ল আপনি কল করতে পারবেন নাZeroMemory
বা SecureZeroMemory
ভিতরে .NET। এবং .NET স্ট্রিংগুলি অপরিবর্তনীয়; এমনকি স্ট্রিংয়ের বিষয়বস্তু আপনি ওভাররাইট করতে পারবেন না যেমন আপনি অন্যান্য ভাষায় করতে পারেন:
//Wipe out the password
for (int i=0; i<password.Length; i++)
password[i] = \0;
তো তুমি কি করতে পার? আমরা যখন NET এর সাথে পাসওয়ার্ড মুছে ফেলার ক্ষমতা বা মেমরি থেকে ক্রেডিট কার্ড নম্বরটি সরবরাহ করি তখন কীভাবে তা সরবরাহ করব?
এটি করার একমাত্র উপায় হ'ল কিছু নেটিভ মেমরি ব্লকে স্ট্রিং স্থাপন করা , যেখানে আপনি কল করতে পারেনZeroMemory
। একটি নেটিভ মেমরি অবজেক্ট যেমন:
- একটি বিএসটিআর
- একটি HGLOBAL
- CoTaskMem নিয়ন্ত্রণহীন মেমরি
সিকিউরস্ট্রিং হারানো ক্ষমতা ফিরে দেয়
.NET- এ, স্ট্রিংগুলি মুছা যায় না যখন আপনি সেগুলি সম্পন্ন করার পরে:
- তারা অপরিবর্তনীয়; আপনি তাদের বিষয়বস্তু ওভাররাইট করতে পারবেন না
- তুমি পার না
Dispose
তাদের
- তাদের পরিষ্কার-পরিচ্ছন্নতা আবর্জনা সংগ্রাহকের করুণায়
সিকিউরস্ট্রিং স্ট্রিং সুরক্ষার চারপাশে যাওয়ার উপায় হিসাবে উপস্থিত রয়েছে এবং আপনার যখন প্রয়োজন তখন সেগুলি পরিষ্কার করার গ্যারান্টি দিতে সক্ষম হবেন।
আপনি প্রশ্ন জিজ্ঞাসা করেছেন:
কেন আমি শুধু বলতে পারি না:
SecureString password = new SecureString("password");
কারণ এখন আপনার password
স্মৃতি আছে; এটি মুছানোর কোনও উপায় নেই। সিএলআর সেই স্মৃতিটিকে পুনরায় ব্যবহারের সিদ্ধান্ত নেওয়ার আগ পর্যন্ত এটি আটকে আছে। আমরা যেখানেই শুরু করেছি সেখানে আপনি ঠিক আমাদের পিছনে ফেলেছেন; একটি পাসওয়ার্ড সহ একটি চলমান অ্যাপ্লিকেশন আমরা এড়াতে পারি না এবং যেখানে মেমরি ডাম্প (বা প্রক্রিয়া মনিটর) পাসওয়ার্ডটি দেখতে পারে।
সিকিউরস্ট্রিং মেমরিতে এনক্রিপ্ট করা স্ট্রিং সঞ্চয় করতে ডেটা সুরক্ষা API ব্যবহার করে; এই ভাবে স্ট্রিংটি অদলবদলগুলি, ক্র্যাশ ডাম্পগুলিতে বা এমনকি স্থানীয় ভেরিয়েবল উইন্ডোতে কোনও সহকর্মীর সাথে আপনার উচিত দেখাতে থাকবে না।
আমি পাসওয়ার্ডটি কীভাবে পড়ব?
তারপরে প্রশ্নটি হল: আমি স্ট্রিংয়ের সাথে কীভাবে যোগাযোগ করব? আপনি একেবারে মতো পদ্ধতি চান না :
String connectionString = secureConnectionString.ToString()
কারণ এখনই আপনি ঠিক যেখানেই শুরু করেছেন - আপনি এমন একটি পাসওয়ার্ড থেকে মুক্তি পেতে পারেন না। আপনি করতে চান বাধ্য সঠিকভাবে সংবেদনশীল স্ট্রিং হ্যান্ডেল করতে ডেভেলপারদের - যাতে এটি করতে মেমরি থেকে মুছে ফেলা।
এজন্যই .NET একটি সুরক্ষিত স্ট্রিংকে একটি নিয়ন্ত্রণহীন মেমোরিতে মার্শাল করতে তিনটি সহায়ক সহায়ক কার্য সরবরাহ করে:
আপনি স্ট্রিংটিকে একটি নিয়ন্ত্রণহীন মেমরি ব্লবতে রূপান্তর করুন, এটি পরিচালনা করুন এবং তারপরে আবার মুছুন।
কিছু এপিআই সিকিউরস্ট্রিংস গ্রহণ করে । উদাহরণস্বরূপ ADO.net 4.5 এ স্ক্যেলকনেকশন.সক্রেনডিয়াল একটি সেট স্কেলক্রেনডিয়েনশন নেয় :
SqlCredential cred = new SqlCredential(userid, password); //password is SecureString
SqlConnection conn = new SqlConnection(connectionString);
conn.Credential = cred;
conn.Open();
আপনি একটি সংযোগ স্ট্রিংয়ের মধ্যে পাসওয়ার্ডও পরিবর্তন করতে পারেন:
SqlConnection.ChangePassword(connectionString, cred, newPassword);
এবং নেট এর ভিতরে অনেকগুলি জায়গা রয়েছে যেখানে তারা সামঞ্জস্যের উদ্দেশ্যে একটি সরল স্ট্রিং গ্রহণ করতে থাকে, তারপরে দ্রুত এটিকে একটি সিকিউরস্ট্রিংয়ে পরিণত করে।
সিকিউরস্ট্রিংয়ে পাঠ্য কীভাবে রাখবেন?
এটি এখনও সমস্যাটি ফেলে দেয়:
আমি প্রথম স্থানে সিকিউরস্ট্রিংয়ে কীভাবে একটি পাসওয়ার্ড পাব?
এটি চ্যালেঞ্জ, তবে মূল বিষয়টি আপনাকে সুরক্ষা সম্পর্কে চিন্তাভাবনা করা।
কখনও কখনও কার্যকারিতা ইতিমধ্যে আপনার জন্য সরবরাহ করা হয়। উদাহরণস্বরূপ, ডাব্লুপিএফ পাসওয়ার্ডবক্স নিয়ন্ত্রণ আপনাকে প্রবেশকারীর পাসওয়ার্ডটি সিকিওরস্ট্রিং হিসাবে সরাসরি ফিরিয়ে দিতে পারে :
বর্তমানে দ্বারা অনুষ্ঠিত পাসওয়ার্ড পায় PasswordBox হিসেবে SecureString ।
এটি সহায়ক কারণ আপনি যে কোনও জায়গায় কাঁচা স্ট্রিংয়ের পাশ দিয়ে চলে যেতেন, এখন আপনার কাছে টাইপ সিস্টেমের অভিযোগ রয়েছে যে সিকিউরস্ট্রিং স্ট্রিংয়ের সাথে বেমানান। আপনার সিকিউরস্ট্রিংকে নিয়মিত স্ট্রিংয়ে ফিরে রূপান্তরিত করার আগে আপনি যতটা সম্ভব দীর্ঘ সময় যেতে চান।
সিকিউরস্ট্রিং রূপান্তর করা যথেষ্ট সহজ:
- SecureStringToBSTR
- PtrToStringBSTR
যেমন হিসাবে:
private static string CreateString(SecureString secureString)
{
IntPtr intPtr = IntPtr.Zero;
if (secureString == null || secureString.Length == 0)
{
return string.Empty;
}
string result;
try
{
intPtr = Marshal.SecureStringToBSTR(secureString);
result = Marshal.PtrToStringBSTR(intPtr);
}
finally
{
if (intPtr != IntPtr.Zero)
{
Marshal.ZeroFreeBSTR(intPtr);
}
}
return result;
}
তারা সত্যিই আপনি এটি করতে চান না।
তবে আমি কীভাবে একটি সিকিউরস্ট্রিংয়ের স্ট্রিং পেতে পারি? ওয়েল, আপনাকে প্রথমে স্ট্রিংয়ের পাসওয়ার্ড থাকা বন্ধ করতে হবে । আপনি এটা আছে করা প্রয়োজন কিছু আর। এমনকি কChar[]
অ্যারে সহায়ক হবে।
আপনি যখন প্রতিটি অক্ষর সংযুক্ত করতে পারেন এবং আপনার কাজ শেষ হয়ে যায় তখন প্লেটেক্সট মুছতে পারেন :
for (int i=0; i < PasswordArray.Length; i++)
{
password.AppendChar(PasswordArray[i]);
PasswordArray[i] = (Char)0;
}
আপনার মুছতে পারে এমন কিছু মেমরিতে আপনার পাসওয়ার্ড সঞ্চিত থাকতে হবে। সেখান থেকে সিকিউরস্ট্রিং এ এটি লোড করুন।
tl; dr: জিরো মেমোরির সমতুল্য সরবরাহের জন্য সিকিউরস্ট্রিং বিদ্যমান ।
কিছু লোক কোনও ডিভাইস লক হয়ে গেলে ব্যবহারকারীর পাসওয়ার্ড মেমোরি থেকে মুছতে, বা স্বাক্ষরিত হওয়ার পরে মেমরি থেকে কী-স্ট্রোক মোছার বিন্দুটি দেখতে পায় না । এই লোকেরা সিকিউরস্ট্রিং ব্যবহার করে না।
SecureString
নতুন বিকাশের জন্য সুপারিশ করে না : github.com/dotnet/platform-compat/blob/master/docs/DE0001.md