স্ট্রিংকে সিকিউরস্ট্রিং রূপান্তর করুন


উত্তর:


137

আপনি না। সিকিউরস্ট্রিং অবজেক্টটি ব্যবহারের পুরো কারণটি হ'ল স্ট্রিং অবজেক্ট তৈরি করা এড়ানো (যা মেমরিতে লোড করা হয় এবং আবর্জনা সংগ্রহের আগ পর্যন্ত সেখানে সরলরেখায় রাখা হয়)। তবে, আপনি একটি সিকিউরস্ট্রিং-এ অক্ষরগুলি যুক্ত করে যুক্ত করতে পারেন।

var s = new SecureString();
s.AppendChar('d');
s.AppendChar('u');
s.AppendChar('m');
s.AppendChar('b');
s.AppendChar('p');
s.AppendChar('a');
s.AppendChar('s');
s.AppendChar('s');
s.AppendChar('w');
s.AppendChar('d');

13
"সংমিশ্রণটি হ'ল 12345... এই ধরণের কোনও বোকা তার লাগেজের উপরে রাখে!"
কলব ক্যানিয়ন

8
আমি যা দেখছি তা হ'ল*****
ইয়ান বয়ড

AppendCharরান সময় পর্যন্ত চালানো হয় না, তাই এই চরিত্রগুলি এখনও আইএল থেকে পড়া যায়, তাই না? সম্ভবত কিছু সংকলন-সময় অবলম্বন পাশাপাশি সহায়তা করবে ... এটি যদি আপনি হার্ড-কোডিং পাসওয়ার্ড হন।
সামিস

5
এটি একটি খোঁড়া যুক্তি। আপনি কোথায় একটি পাসওয়ার্ড পাবেন? কোনও ফর্ম বা কমান্ড লাইন থেকে তারা সরাসরি কোনও ডিভাইস বা কমান্ড লাইন আর্গুমেন্ট থেকে সুরক্ষিত স্ট্রিং পড়ার পদ্ধতি তৈরি না করা পর্যন্ত আমাদের স্ট্রিংটিকে সিকিউরস্ট্রিংয়ে রূপান্তর করতে হবে।
Quarkly

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

159

SecureStringএবং এর মধ্যে রূপান্তর করার আরও একটি উপায়ও রয়েছে String

স্ট্রিং টু সিকিউরস্ট্রিং

SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;

2. স্ট্রিং থেকে সিকিউরস্ট্রিং

string theString = new NetworkCredential("", theSecureString).Password;

লিঙ্কটি এখানে


3
সবচেয়ে সাধারণ ব্যবহারের ক্ষেত্রে এটি এখন পর্যন্ত সেরা সমাধান!
ড্যান বেচার্ড

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

14
@ জিয়ানপাওলো থিওরিতে সঠিক হলেও বাস্তবে SecureStringকিছু লাইব্রেরির সাথে কাজ করার সময় আমাদের ব্যবহার করা দরকার । এবং এখানে সৎ হতে দিন, যদি কেউ আপনার অ্যাপ্লিকেশনটির স্মৃতি সক্রিয়ভাবে স্ক্যান করছে তবে আপনি ইতিমধ্যে হারিয়ে ফেলেছেন। এমনকি আপনি যদি সিকিউরস্ট্রিং সঠিকভাবে ব্যবহার করে থাকেন, যা আমি কখনও দেখিনি, সেখানে নিষ্কাশনের জন্য অন্যান্য মূল্যবান ডেটা থাকবে।
জোনাথন অ্যালেন

1
@ জোনাথন অ্যালেন: আপনি সম্ভবত সঠিক, তবে কেবলমাত্র আমাদের কাছে সুরক্ষা বিবেচনার পরে বিবেচনা করার সংস্কৃতি রয়েছে। যদি আপনি একটি রেসিপি ওয়েবসাইট তৈরি করেন তবে উত্তর কোরিয়া আপনার প্রোগ্রামটির স্মৃতি স্ক্যান করার চেষ্টা করবে না। আপনি যদি ব্যাংকিং সফটওয়্যারটি লিখছেন তবে হুমকিটি আরও সত্য।
এরিক জে

58

নীচের পদ্ধতিটি স্ট্রিংকে সুরক্ষিত স্ট্রিংয়ে রূপান্তর করতে সহায়তা করে

private SecureString ConvertToSecureString(string password)
{
    if (password == null)
        throw new ArgumentNullException("password");

    var securePassword = new SecureString();

    foreach (char c in password)
        securePassword.AppendChar(c);

    securePassword.MakeReadOnly();
    return securePassword;
}

26
+1, তবে নোট করুন যে স্ট্রিং প্যারামিটার হিসাবে পাসওয়ার্ডটি পাসওয়ার্ড করা ম্যানেজড মেমোরিতে একটি এনক্রিপ্ট করা স্ট্রিং উদাহরণ তৈরি করে এবং 'সিকিউরস্ট্রিং' এর উদ্দেশ্যটিকে প্রথম স্থানে পরাজিত করে। ভবিষ্যতের লোকেরা যারা এই কোডটি নিয়ে আসে এবং ব্যবহার করে তাদের জন্য কেবল এটি নির্দেশ করে।
কোডি

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

3
@ কোডি সরে গেছে যে সিকিওরস্ট্রিং শ্রেণি এমনকি স্ট্রিংকে এনক্রিপ্ট করতে পারে না। যে কারণে এমএস github.com / ডটনেট / প্ল্যাটফর্ম-compat/blob/master/docs/DE0001.md টাইপকে অপ্রচলিত করার বিষয়ে বিবেচনা করছেন
মার্টিন ব্রাউন

19

আপনি এটি অনুসরণ করতে পারেন:

string password = "test";
SecureString sec_pass = new SecureString();
Array.ForEach(password.ToArray(), sec_pass.AppendChar);
sec_pass.MakeReadOnly();

11

এখানে একটি সস্তা লিনাক ট্রিক।

            SecureString sec = new SecureString();
            string pwd = "abc123"; /* Not Secure! */
            pwd.ToCharArray().ToList().ForEach(sec.AppendChar);
            /* and now : seal the deal */
            sec.MakeReadOnly();

32
এই উত্তরটি একটি অনুশীলনটি দেখছে যে প্লেইন পাঠ্যের কতগুলি অস্থায়ী অনুলিপিগুলি একটি শটে তৈরি করা যায়
মাইক ক্যারন

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

8

আমি এটি এখানে ফেলে দেব। কেন?

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

আমি বিপত্তিটি বলব যে আপনার আবেদনের স্ট্রিংগুলি সুরক্ষিত করার বিষয়ে চিন্তা করার আগে আপনার কাছে কিছু নকশা স্তরের সমস্যাগুলি মোকাবেলা করতে পারে। আপনি কী করার চেষ্টা করছেন সে সম্পর্কে আমাদের আরও কিছু তথ্য দিন এবং আমরা আরও ভালভাবে সহায়তা করতে সক্ষম হতে পারি।


1
আমি কেবল এটি প্রসেসস্টার্টআইএনফো-র পাসওয়ার্ড সেট করতে এবং আমার ব্যবহারকারীকে বিভিন্ন ব্যবহারকারী হিসাবে চালাতে ব্যবহার করতে চাই .. এটি আমার পক্ষে কাজ করেছে ...
বিকাশকারী

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

সুতরাং এই পদ্ধতিটি কাউকে পাসওয়ার্ড দেখতে বাধা দেয় না যদি সে ডটপিকের মতো ডিকম্পাইলার ব্যবহার করে? এই ক্ষেত্রে স্ট্রিংগুলি লুকানোর কোনও উপায় আছে?
এম। প্যারেন্ট

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


5

কোনও অভিনব লিঙ্ক নেই, হাত দিয়ে সমস্ত অক্ষর যুক্ত করা হয়নি, কেবল সহজ এবং সরল:

var str = "foo";
var sc = new SecureString();
foreach(char c in str) sc.appendChar(c);

এমনকি ফ্যানসিয়ার, কোনও ভেরিয়েবল সংজ্ঞায়িত করার দরকার নেই
বিগওয়ার্ল্ড 12

এখানে একটি লাইনার রয়েছে:var sc = new SecureString(); foreach(char c in "foo") sc.appendChar(c);
বিগওয়ার্ল্ড 12

4

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


3

আমি কেবল সমস্ত লোককে এই কথাটি বলতে চাই, "এটি এর বিন্দু নয় SecureString", যে এই প্রশ্নটি জিজ্ঞাসা করা অনেক লোকই এমন একটি অ্যাপ্লিকেশনে থাকতে পারে যেখানে, যে কারণেই হোক না কেন, ন্যায়সঙ্গত বা না হোক, তারা বিশেষত উদ্বিগ্ন নয় পাসওয়ার্ডের একটি অস্থায়ী অনুলিপি জিসি-সক্ষম স্ট্রিং হিসাবে গাদা হয়ে বসে থাকে তবে তাদের এমন একটি API ব্যবহার করতে হবে যা কেবলমাত্রSecureString বস্তু গ্রহণ করে। সুতরাং, আপনার কাছে এমন একটি অ্যাপ্লিকেশন রয়েছে যেখানে আপনার যত্ন নেইপাসওয়ার্ডটি স্তূপে রয়েছে কিনা, সম্ভবত এটি কেবলমাত্র অভ্যন্তরীণ-ব্যবহার এবং কেবলমাত্র পাসওয়ার্ড কেবল সেখানে অন্তর্নিহিত নেটওয়ার্ক প্রোটোকলগুলির দ্বারা প্রয়োজনীয় কারণ রয়েছে এবং আপনি দেখতে পাচ্ছেন যে পাসওয়ার্ডটি যেখানে সঞ্চিত আছে সেগুলি যেমন কোনও দূরবর্তী পাওয়ারশেল সেট আপ করতে ব্যবহার করা যায় না রানস্পেস - তবে তৈরি করতে কোনও সহজ, সোজা-সরাসরি ওয়ান-লাইনার নেইSecureStringযা তোমার চাই. এটি একটি সামান্য অসুবিধা - তবে সত্যিকারের যে অ্যাপ্লিকেশনগুলির প্রয়োজন হয় তা লেখকদের ব্যবহার বা মধ্যস্থতাকারীদের প্ররোচিত না করে তা নিশ্চিত করার পক্ষে এটি সম্ভবত মূল্যবান । :-)SecureStringSystem.StringSystem.Char[]


2

আপনি যদি একটি রূপান্তর কম্প্রেস করতে চান তাহলে stringএকটি থেকে SecureStringএকটি মধ্যে LINQবিবৃতি নিম্নরূপঃ আপনি এটা প্রকাশ করতে পারেন:

var plain  = "The quick brown fox jumps over the lazy dog";
var secure = plain
             .ToCharArray()
             .Aggregate( new SecureString()
                       , (s, c) => { s.AppendChar(c); return s; }
                       , (s)    => { s.MakeReadOnly(); return s; }
                       );

তবে, মনে রাখবেন যে ব্যবহারটি LINQএই সমাধানের সুরক্ষা উন্নত করে না। এটা তোলে থেকে কোন রূপান্তর হিসাবে একই ত্রুটি ভুগছেন stringকরতে SecureString। যতক্ষণ stringনা স্মৃতিতে আসল থাকে ততক্ষণ ডেটা দুর্বল থাকে।

বলা হচ্ছে, উপরোক্ত বিবৃতিটি যা দিতে পারে তা হ'ল এটি তৈরির বিষয়টি SecureString, ডেটা দিয়ে এর সূচনা এবং অবশেষে এটি পরিবর্তন থেকে লক করা।


2

নিম্নলিখিত 2 এক্সটেনশনের কৌশলটি করা উচিত:

  1. একটি charঅ্যারের জন্য

    public static SecureString ToSecureString(this char[] _self)
    {
        SecureString knox = new SecureString();
        foreach (char c in _self)
        {
            knox.AppendChar(c);
        }
        return knox;
    }
  2. এবং জন্য string

    public static SecureString ToSecureString(this string _self)
    {
        SecureString knox = new SecureString();
        char[] chars = _self.ToCharArray();
        foreach (char c in chars)
        {
            knox.AppendChar(c);
        }
        return knox;
    }

সুপারিশের জন্য জন ডাগকে ধন্যবাদ AppendChar


0

আপনি এই সহজ স্ক্রিপ্ট ব্যবহার করতে পারেন

private SecureString SecureStringConverter(string pass)
{
    SecureString ret = new SecureString();

    foreach (char chr in pass.ToCharArray())
        ret.AppendChar(chr);

    return ret;
}

1
এই উত্তর পোস্ট করা হয়েছে 15 মাস আগে । এটি আবার পোস্ট করার দরকার ছিল না।
GSerg
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.