﻿
{"id":5915,"date":"2017-04-06T13:26:40","date_gmt":"2017-04-06T13:26:40","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=5915"},"modified":"2017-04-06T13:26:40","modified_gmt":"2017-04-06T13:26:40","slug":"cta-securestring-sinifi-ile-memory-guvenligi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/cta-securestring-sinifi-ile-memory-guvenligi\/","title":{"rendered":"C#&#8217;ta SecureString S\u0131n\u0131f\u0131 \u0130le Memory G\u00fcvenli\u011fi"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>\u00dczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131z projede k\u00e2h kullan\u0131c\u0131lar i\u00e7in k\u00e2h yaz\u0131l\u0131m i\u00e7in \u00f6nem arz eden kritik bilgiler \u00fczerinde \u00e7al\u0131\u015f\u0131yor olabilirsiniz. Bu bilgiler kullan\u0131c\u0131lara binaen kimlik yahut kredi kart\u0131 bilgileri olabilecekken, yaz\u0131l\u0131ma dair ba\u011flant\u0131, port veya herhangi bir devlet s\u0131rr\u0131 olabilir. \u00c7o\u011fu yaz\u0131l\u0131mc\u0131 bu tarz bilgileri String ifadeler olarak tutmakta ve \u00fczerinde \u00e7al\u0131\u015fmaktad\u0131r. Teknik olarak uygulamada kullan\u0131lan de\u011fi\u015fkenler memory \u00fczerinde tutulaca\u011f\u0131 i\u00e7in ve 2. ya da 3. \u015fah\u0131slar taraf\u0131ndan memorye ula\u015f\u0131l\u0131p sistem \u00fczerinde d\u00f6nen t\u00fcm verilerin i\u00e7eriklerinde g\u00f6zlem yapabilme ihtimalleri oldu\u011fu i\u00e7in bizlerin bu de\u011fi\u015fkenleri g\u00fcvenli bir \u015fekilde \u015fifrelememiz ve korumam\u0131z gerekmektedir.<\/p>\n<p>Konumuzu memory \u00fczerinde biraz daha detaya inerek geli\u015ftirelim. Mevcut uygulamam\u0131z\u0131n i\u015fleyi\u015fi s\u0131ras\u0131nda memory&#8217;de tutulan verilerin yerleri de\u011fi\u015febilme ihtimaliyle beraber, bir kopyas\u0131n\u0131n daha olu\u015fturulabilme ihtimalide mevcuttur. Ee haliyle bu gibi bir durumda memory&#8217;de bulunan de\u011fi\u015fkenimizden birden fazla yerde olma ihtimali mevcuttur. \u0130\u015fte bu ihtimal kritik bilgilerin memory de 2. ya da 3. \u015fah\u0131slar taraf\u0131ndan ele ge\u00e7irilme ihtimalini y\u00fckseltmekte ve biz yaz\u0131l\u0131mc\u0131lara b\u00fcy\u00fck g\u00f6rev ve sorumluluk y\u00fcklemektedir.<\/p>\n<p>Yukar\u0131da da bahsetti\u011fim gibi kritik bilgiler genellikle kompleks yahut metinsel olduklar\u0131ndan dolay\u0131 bir \u00e7ok yerde String ifadeler e\u015fli\u011finde tutulmaktad\u0131r. <em>Peki String ifadelerin memory yap\u0131lanmas\u0131ndaki i\u015flevsel \u00f6zellikleri nelerdir?<\/em> diye sorma ihtimalinize nazaran birazda bu konuya a\u00e7\u0131kl\u0131k getirmekte fayda var.<\/p>\n<p>String ifadeler immutable(sabit\/kesin\/de\u011fi\u015fmez) yap\u0131lard\u0131r. Yani string bir ifade \u00fczerinde yap\u0131lan herhangi bir i\u015flem(ekleme, \u00e7\u0131karma, de\u011fi\u015ftirme vs.) direkt olarak de\u011fi\u015fkenin bellekteki fiziksel yap\u0131s\u0131na yans\u0131t\u0131lmamakta, ilgili de\u011fi\u015fkenin bir kopyas\u0131 olu\u015fturularak yap\u0131lan yeniliklerin o kopya \u00fczerine ger\u00e7ekle\u015ftirilmesini sa\u011flamaktad\u0131r. Bu i\u015flem, eski de\u011fi\u015fkenin oldu\u011fu gibi haf\u0131zadaki ilgili adreste kald\u0131\u011f\u0131 anlam\u0131na gelmektedir. <\/p>\n<p>Yani uzun laf\u0131n k\u0131sas\u0131, bizler elimizdeki kritik bilgileri tuttu\u011fumuz de\u011fi\u015fkenler \u00fczerinde ne yaparsak yapal\u0131m bu bilgilerin orjinal hallerine haf\u0131za \u00fczerinden eri\u015filebilme ihtimali her daim olacakt\u0131r. Ta ki SecureString s\u0131n\u0131f\u0131 ile \u00e7al\u0131\u015fmam\u0131z\u0131 ger\u00e7ekle\u015ftirene kadar&#8230;<\/p>\n<p>SecureString s\u0131n\u0131f\u0131 ile m\u00fcdahale etti\u011fimiz de\u011fi\u015fkenlerin bellek \u00fczerinde DPAPI (Data Protection API) ile \u015fifreli bir \u015fekilde tutulmas\u0131n\u0131 sa\u011flamaktay\u0131z. Ayr\u0131ca de\u011fi\u015fken de\u011ferinde yap\u0131lan herhangi bir i\u015flemi de\u011fi\u015fkenin kopyas\u0131n\u0131 olu\u015fturmadan, direkt olarak bellekteki fiziksel de\u011fi\u015fkene yans\u0131tacakt\u0131r. <\/p>\n<p>\u015eimdi a\u015fa\u011f\u0131daki \u00f6rnek kod blo\u011funu inceleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            string KrediKartiNo = &quot;1234123412341234&quot;;\r\n            SecureString secure = new SecureString();\r\n            KrediKartiNo.ToCharArray().ToList().ForEach(c =&gt; secure.AppendChar(c));\r\n            secure.MakeReadOnly();\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer SecureString s\u0131n\u0131f\u0131 ile kritik bilgi ta\u015f\u0131d\u0131\u011f\u0131n\u0131 varsayd\u0131\u011f\u0131m\u0131z KrediKartiNo isimli de\u011fi\u015fkeni koruma alt\u0131na almaktay\u0131z. Tabi bu i\u015flem i\u00e7in kritik bilgi bir karakter dizisine \u00e7evrildikten sonra AppendChar metodu ile tek tek karakterleri ilgili SecureString nesnesine ili\u015ftirilmektedir. Son olarak MakeReadOnly metodu ile string de\u011fi\u015fkenimizi herhangi bir i\u015fleve kar\u015f\u0131 immutable yap\u0131yoruz.<\/p>\n<p>Burada vurgulamak istedi\u011fim bir nokta vard\u0131r ki o da, yapm\u0131\u015f oldu\u011fumuz i\u015flemin KrediKartiNo isimli de\u011fi\u015fkeni \u015fifreli bir \u015fekilde elde etmek olmad\u0131\u011f\u0131d\u0131r. Burada ki niyet bellekte ilgili bilgiye k\u00f6t\u00fc niyetli ki\u015filerin eri\u015fimini engellemek i\u00e7in bellekteki fiziksel de\u011fi\u015fkene bir koruma olu\u015fturmu\u015f olduk. Bilakis de\u011fi\u015fkenin de\u011ferine eri\u015fmek istedi\u011fimizde direkt olarak ne ise o \u015fekilde elde edilecektir.<\/p>\n<p>SecureString s\u0131n\u0131f\u0131 ile koruma alt\u0131na al\u0131nan de\u011fi\u015fkenlerin verilerini \u00e7al\u0131\u015fma zaman\u0131(run time) s\u00fcrecinde a\u015fa\u011f\u0131daki gibi birden fazla yolla elde edebiliriz.<\/p>\n<p><strong>1. Yol<\/strong><\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            string KrediKartiNo = &quot;1234123412341234&quot;;\r\n            SecureString secure = new SecureString();\r\n            KrediKartiNo.ToCharArray().ToList().ForEach(c =&gt; secure.AppendChar(c));\r\n            secure.MakeReadOnly();\r\n\r\n            IntPtr x = Marshal.SecureStringToBSTR(secure);\r\n            string Deger = Marshal.PtrToStringUni(x);\r\n<\/pre>\n<p><strong>2. Yol<\/strong><\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            string KrediKartiNo = &quot;1234123412341234&quot;;\r\n            SecureString secure = new SecureString();\r\n            KrediKartiNo.ToCharArray().ToList().ForEach(c =&gt; secure.AppendChar(c));\r\n            secure.MakeReadOnly();\r\n\r\n            IntPtr x = Marshal.SecureStringToBSTR(secure);\r\n            string Deger = Marshal.PtrToStringAuto(x);\r\n<\/pre>\n<p>Dikkat ederseniz vermi\u015f oldu\u011fum bu ilk iki yolda Marshal s\u0131n\u0131f\u0131n\u0131n static elemanlar\u0131ndan olan SecureStringToBSTR metodu arac\u0131l\u0131\u011f\u0131yla ilgili SecureString nesnesindeki de\u011fi\u015fkenin de\u011feri memoryden okunmakta ve IntPtr tipinden bir nesne olarak elde edilmektedir. Ve tekrardan bu IntPtr nesnesi Marshal s\u0131n\u0131f\u0131n\u0131n static olan PtrToStringUni, PtrToStringAuto vs. gibi metotlar\u0131 arac\u0131l\u0131\u011f\u0131yla i\u015flenerek de\u011feri stringe \u00e7evrilerek elde edilmektedir.<\/p>\n<p><strong>3. Yol<\/strong><\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            string KrediKartiNo = &quot;1234123412341234&quot;;\r\n            SecureString secure = new SecureString();\r\n            KrediKartiNo.ToCharArray().ToList().ForEach(c =&gt; secure.AppendChar(c));\r\n            secure.MakeReadOnly();\r\n\r\n            IntPtr x = Marshal.SecureStringToBSTR(secure);\r\n\r\n            char&#x5B;] topla = new char&#x5B;secure.Length];\r\n            Marshal.Copy(x, topla, 0, secure.Length);\r\n            string Deger = string.Join(&quot;&quot;, topla);\r\n            Marshal.ZeroFreeBSTR(x);\r\n<\/pre>\n<p>Bu 3. yolda ise Unmanaged Code(Y\u00f6netilmeyen Kod) ve CLR d\u0131\u015f\u0131 alanlara bula\u015fm\u0131\u015f olduk.<\/p>\n<p>Son olarak SecureString s\u0131n\u0131f\u0131 ile korumaya alaca\u011f\u0131m\u0131z her de\u011fi\u015fkene \u00f6zel bu \u00e7al\u0131\u015fmay\u0131 tek tek yapmaktansa a\u015fa\u011f\u0131daki gibi bir Extension metot ile bu i\u015flemi tek seferde ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    static class Extension\r\n    {\r\n        public static SecureString Protect(this string x)\r\n        {\r\n            SecureString secure = new SecureString();\r\n            x.ToCharArray().ToList().ForEach(c =&gt; secure.AppendChar(c));\r\n            secure.MakeReadOnly();\r\n            return secure;\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00fcn\u00fcm\u00fczde bilgi her ne kadar g\u00fc\u00e7 olsada, bilgiyi koruyabilmek g\u00fcc\u00fcn iki kat\u0131d\u0131r. O y\u00fczden bu tarz durumlar\u0131 her daim g\u00f6z \u00f6n\u00fcnde bulundurarak \u00e7al\u0131\u015fmalar\u0131m\u0131zda titiz davranmaya \u00f6zen g\u00f6stermeliyiz.<\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar dilerim&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, \u00dczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131z projede k\u00e2h kullan\u0131c\u0131lar i\u00e7in k\u00e2h yaz\u0131l\u0131m i\u00e7in \u00f6nem arz eden kritik bilgiler \u00fczerinde \u00e7al\u0131\u015f\u0131yor olabilirsiniz. Bu bilgiler kullan\u0131c\u0131lara binaen kimlik yahut kredi kart\u0131 bilgileri olabilecekken, yaz\u0131l\u0131ma dair ba\u011flant\u0131, port veya herhangi&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3223,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[27,1675,1685,1677,1676,1678,1679,1674,1682,1681,1671,1673,1672,1680,1683,1684],"class_list":["post-5915","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","tag-c","tag-c-securestring","tag-clr","tag-data-protection-api","tag-dpapi","tag-immutable","tag-marshal","tag-memory-securestring","tag-ptrtostringauto","tag-ptrtostringuni","tag-securestring","tag-securestring-class","tag-securestring-sinifi","tag-securestringtobstr","tag-unmanaged-code","tag-yonetilmeyen-kod"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/5915","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=5915"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/5915\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3223"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=5915"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=5915"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=5915"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}