https://buraksenyurt.com/Burak Selim Şenyurt - Tek Fotoluk Ipucu2017-10-25T09:13:38+00:00Matematik Mühendisi Bir Bilgisayar Programcısının NotlarıBurak Selim SenyurtBlogEngine.Net Syndication Generatorhttps://buraksenyurt.com/opml.axdBurak Selim SenyurtMatematik Mühendisi Bir Bilgisayar Programcısının Notlarıtr-TRBurak Selim Şenyurt0.0000000.000000https://buraksenyurt.com/post/tek-fotoluk-ipucu-160-bir-sertifikanin-base64-encoded-degerini-bulmakTek Fotoluk İpucu 160 - Bir Sertifikanın Base64 Encoded Değerini Bulmak2017-10-25T09:04:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p><a href="https://buraksenyurt.com/post/wcf-ozellestirilmis-usernamepasswordvalidator-kullanimi" target="_blank">Önceki yazımızda</a> WsHttpBinding kullandığımız sertifika tabanlı bir WCF senaryo çalışmamız vardı. Aynı örneği göz önüne alarak BasicHttpBinding kullanabileceğimizi de belirtelim. Nitekim bu bağlayıcı tipi ile de Message tabanlı güvenliği sertifika bazlı gerçekleştirebiliriz. Bunun en gerekli sebeplerinden birisi de servis tüketicilerinin eski nesil uygulamalar olabilmesi sebebiyle sadece SOAP 1.1 haberleşme kurmasıdır. Olmaz demeyin oluyor. Geliştirmekte olduğumuz projede buna benzer bir ihtiyaçla karşılaştık. Bazı servis tüketicilerimiz sadece SOAP 1.1 paketi gönderebilir durumdalar. Tabii öncelikle bizim .Net ortamında bu senaryoyu test edebilmemiz gerekmekteydi. Bağlayıcı tipini belirledik, Message güvenliğini ayarladık, sertifika tanımlamalarını yükledik ve servisi ayağa kaldırıp istemciye proxy tipini indirttik. İstemci web.config dosyasında gerekli ayarlamaları yaptık. Ne varki istemci tarafındaki endpoint bildiriminde yaptığımız aşağıdaki örnek tanımlama işe BasicHttpBinding tipi özelinde işe yaramadı ve çalışma zamanında "The request message must be protected" şeklinde hata aldık.</p>
<pre class="brush:xml;auto-links:false;toolbar:false" contenteditable="false"><identity>
<dns value="AzonServer"/>
</identity></pre>
<p>Bunun üzerine istemci tarafında belirtilmesi gereken sertifikanın base64 formatında encode edilmiş halini denemeye karar verdik. Yani aşağıdaki şekilde.</p>
<pre class="brush:xml;auto-links:false;toolbar:false" contenteditable="false"><identity>
<certificate encodedValue=""/>
</identity></pre>
<p>Tabii bir sertifikanın base64 bazlı halini nasıl elde edeceğimizi bilmiyorduk. Öğrendik. Nasıl mı oluyormuş? Aynen aşağıdaki ekran görüntüsündeki gibi.</p>
<p><img src="https://buraksenyurt.com/image.axd?picture=/2017/11/tfi_160.gif" alt="" /></p>
<p>Koddaki AzonServer isimli sertifika CurrentUser->My deposu altında yer alıyor. Bu depoya ulaşmak için bir X509Store nesnesi örnekliyoruz. Sonrasında Certificates koleksiyonuna gidiyor ve SubjectName değerine göre<em>(ki bu Comman Name'e denk gelecektir)</em> arama yapıyoruz. Tabii ilgili sertifikanın olduğunu varsayıyoruz. Yoksa array için çalışma zamanı hatası alacağımız aşikar. Sertifikayı elde ettikten sonra bunu ihraç ediyor ve ToBase64String fonksiyonundan yararlanarak base64 encode edilmiş halini elde ediyoruz. Elde ettiğimiz içeriği de Clipboard'a<em>(System.Windows.Forms kütüphanesini referans etmeli ve STAThread niteliğini kullanmalıyız)</em> kopyalamayı ihmal etmiyoruz ki sonrasında tek yapacağımz şey Ctrl+V olsun. Bu hızlı ve ani çözümü uygulamak için Powershell'den de yararlanabilirsiniz bunu da belirteyim. Araştırın derim.</p>
<p>Bir başka ipucunda görüşmek üzere hepinize mutlu günler dilerim.</p>2017-10-25T09:04:00+00:00tek fotoluk ipucuX509Store X509Certificate2 base64 encodingbasicHttpBindingcertificate based authenticationauthenticationwcfbsenyurtÖnceki yazımızda WsHttpBinding kullandığımız sertifika tabanlı bir WCF senaryo çalışmamız vardı. Aynı örneği göz önüne alarak BasicHttpBinding kullanabileceğimizi de belirtelim. Nitekim bu bağlayıcı tipi ile de Message tabanlı güvenliği sertifika bazlı gerçekleştirebiliriz. Bunun en gerekli sebeplerinden birisi de servis tüketicilerinin eski nesil uygulamalar olabilmesi sebebiyle sadece SOAP 1.1 haberleşme kurmasıdır. Olmaz demeyin oluyor.https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=9789cc9f-a468-43ab-a886-dd7ae1d53e1c0https://buraksenyurt.com/trackback.axd?id=9789cc9f-a468-43ab-a886-dd7ae1d53e1chttps://buraksenyurt.com/post/tek-fotoluk-ipucu-160-bir-sertifikanin-base64-encoded-degerini-bulmak#commenthttps://buraksenyurt.com/syndication.axd?post=9789cc9f-a468-43ab-a886-dd7ae1d53e1chttps://buraksenyurt.com/post/tek-fotoluk-ipucu-152-debuggerdisplay-attributeTek Fotoluk İpucu 152 - DebuggerDisplay Niteliği ile Debugging Daha Sevimli Olabilir2017-02-16T21:29:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p>Nitelikler bildiğiniz üzere çalışma zamanına bilgi taşımak amacıyla kullanılan önemli tiplerdendir. Visual Studio tarafında da işimize yarayan bir çok nitelik(Attribute) yer alır. Bunlardan birisi DebuggerDisplay'dir. Önce aşağıdaki ekran görüntüsündeki kod parçasını göz önüne alalım.</p>
<p><img src="https://buraksenyurt.com/image.axd?picture=/2017/02/tfi152_1.gif" alt="" /></p>
<p>Product isimli sınıfımız ve kendisinden örneklenen nesnelere sahip bir listemiz var. Debug modda olduğumuz kesin. basket değişkeni üzerinde durduğumuzda ise UseDebuggerDisplay.Product şeklinde Namespace.typeName notasyonuna uygun çıktılar görüyoruz. Aslında bir şeyleri debug ederken bu tip listeler üzerinde işe yarar bilgilerin görünmesi daha iyi olabilir<em>(Nitekim + ile açıp ulaşmaya çalışmak yerine o anda hemen görebilmek benim tercih ettiğim bir görüntülenme şekli)</em> Visual Studio bir çalışma zamanı ortamı olduğuna göre ona bunu öğretmemiz gerekiyor. İşte DebuggerDisplay niteliği bu aşamada devreye giriyor. Nasıl mı? Aynen aşağıdaki fotoğrafta görüldüğü gibi.</p>
<p><img src="https://buraksenyurt.com/image.axd?picture=/2017/02/tfi152_2.gif" alt="" /></p>
<p>Tek yaptığımız Product sınıfının başına System.Diagnostics alanında bulunan DebuggerDisplay niteliğini uygulamak oldu. {} içerisinde verilen DebugMessage ifadesinin Product sınıfının private bir özelliği olduğuna ve yanlızca okunabilir tanımlandığına<em>(mecburi değil)</em> dikkat edelim. Read-Only olması mantıklı çünkü bu özelliği object user değil Visual Studio ortamı kullanıyor. Aslında DebugMessage özelliğinin döndürdüğü string içeriğin formatını DebuggerDisplay niteliğinde doğrudan kullanabiliriz de ancak bu şekilde gerekli ifadeyi(expression), nitelikten alıp bir fonskiyonda sarmalamış oluyoruz. get bir metod bloğu olduğundan içerisinde çok daha farklı işlemler yapabiliriz. Söz gelimi bu bir kategori tipi olsa ve içerisinde ürün listesi barındırsa, kategori adının yanında kaç tane ürün olduğunu ve toplam liste fiyatını göstermek için gerekli hesaplamaları bu blok içerisinde yazabiliriz<em>(Bence bunu bir deneyin)</em> </p>
<blockquote>
<p>Aynı işi aslında ToString metodunu override ederek yapma şansına da sahibiz. Diğer yandan DebuggerDisplay niteliği üzerinden çalışma zamanında bazı özel işvelsellikle gönderme şansına da sahibiz. Söz gelimi nq=No Quatos şeklinde bir bilgi gönderebiliriz. Bir diğer tercih sebebi de az önce bahsettiğimiz gibi ToString'in private bir metod olmayışıdır. Tipin ToString metodunu dışarıya açmak istemediğimiz durumlarda DebuggerDisplay kullanımı ve bu sorumluluğun private bir metoda devredilmesi mantıklıdır.</p>
</blockquote>
<p>Bir başka ipucunda görüşmek dileğiyle hepinize mutlu günler dilerim.</p>2017-02-16T21:29:00+00:00c#tek fotoluk ipucuattributedebugvisual studiometadata programmingclrcommon language runtimebsenyurtNitelikler bildiğiniz üzere çalışma zamanına bilgi taşıma amacıyla kullanılan önemli kabiliyetlerdendir. Visual Studio tarafında da işimize yarayan bir çok nitelik(Attribute) yer alır. Bunlardan birisi de DebuggerDisplay niteliğidir. Önce aşağıdaki ekran görüntüsündeki kod parçasını göz önüne alalım.https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=c67627cc-0188-45f9-8151-70a23914b3c71https://buraksenyurt.com/trackback.axd?id=c67627cc-0188-45f9-8151-70a23914b3c7https://buraksenyurt.com/post/tek-fotoluk-ipucu-152-debuggerdisplay-attribute#commenthttps://buraksenyurt.com/syndication.axd?post=c67627cc-0188-45f9-8151-70a23914b3c7https://buraksenyurt.com/post/tek-fotoluk-ipucu-151-c-reflection-ve-about-infoTek Fotoluk İpucu 151 - C#, Reflection ve About Info2017-01-12T22:00:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p>Programlardaki About Info kısımlarını bilirsiniz. Yazdığımız uygulama hakkında bir takım bilgiler verir. Genellikle ürünün adı, bir iki cümle ile ne yaptığı, üreticisi ve hatta versyion numarası ve benzeri bilgiler yer alır. Micorosoft .Net tarafında aslında bu tip bilgileri Assembly'a ait niteliklerde<em>(attribute)</em> belirtiriz. Aynen aşağıdaki ekran görüntüsünde olduğu gibi.</p>
<p><img src="https://buraksenyurt.com/image.axd?picture=/2017/01/tfi_151_1.gif" alt="" /></p>
<p>Peki bu bilgileri<em>(en azından son kullanıcı için işe yarar olanları)</em> nasıl elde edebiliriz? Visual Basic tarafında olukça kolayken C# tarafında işin içerisine Reflection'ı katmamız gerekir. Aşağıdaki sınıfa bir bakalım.</p>
<p><img src="https://buraksenyurt.com/image.axd?picture=/2017/01/tfi151_2.gif" alt="" /></p>
<p>Aslında kritik nokta Reflection ile Assembly özelliklerinin tutulduğu niteliklere<em>(Attribute)</em> bir şekilde ulaşmak. O an çalışmakta olan Assembly örneğini yakalamakla işe başlıyoruz. GetName ile ulaştığımız değişken üzerinden Name ve Version gibi bilgilere ulaşmak mümkün. Lakin Title, Description, Product, Copyright, Trademark ve Company bilgileri Assembly için birer nitelik olarak tutulmakta. Dolayısıyla çalışma zamanında ilgili nitelikleri çalışmakta olan Assembly için okumamız gerekiyor. Bu işi biraz olsun kolaylaştırmak adına GetValue isimli generic bir metod kullandık. T ile gelen niteliğin property ile belirtilen özellik değerini, current ile işaret ettiğimiz güncel Assembly nesne örneği üzerinden yakalamaya çalışıyoruz. Generic bilgilerinizi tazelemenin tam zamanı. Çalışma zamanı görüntüsü ise aşağıdaki gibidir.</p>
<p><img src="https://buraksenyurt.com/image.axd?picture=/2017/01/tfi151_3.gif" alt="" /></p>
<p>Görüldüğü üzere projeyi derlemeden önce girdiğimiz temel bilgileri çalışma zamanında yakaladık. Elbette bir Console uygulamasında assembly bilgilerini almak çok mantıklı değil. Windows Forms, WPF, Mobile ve benzeri platformlarda bu fonskiyonellik daha çok işinize yarayabilir. Daha da önemlisi envanterde yer alan ne kadar .Net uygulaması varsa onlar hakkında bilgiler alabilir ve belki de bir portal geliştirebiliriz. Hatta geliştirilen uygulamalar için Assembly seviyesinde eksik nitelik bilgilerini de yakalayabilirsiniz. Gerisi sizde. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.</p>2017-01-12T22:00:00+00:00.netc#tek fotoluk ipucuassemblyreflectiongenericgeneric constraintsattributebsenyurtProgramlardaki About Info kısımlarını bilirsiniz. Yazdığımız uygulama hakkında bir takım bilgiler verir. Genellikle ürünün adı, bir iki cümle ile ne yaptığı, üreticisi ve hatta versyion numarası ve benzeri bilgiler yer alır. Micorosoft .Net tarafında aslında bu tip bilgileri Assembly'a ait niteliklerde(attribute) belirtiriz. Aynen aşağıdaki ekran görüntüsünde olduğu gibi.https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=02cad426-db6c-45ac-a95b-b3322d95170d0https://buraksenyurt.com/trackback.axd?id=02cad426-db6c-45ac-a95b-b3322d95170dhttps://buraksenyurt.com/post/tek-fotoluk-ipucu-151-c-reflection-ve-about-info#commenthttps://buraksenyurt.com/syndication.axd?post=02cad426-db6c-45ac-a95b-b3322d95170dhttps://buraksenyurt.com/post/tek-fotoluk-ipucu-150-sertifika-tabanli-rest-cagrisi-yapmakTek Fotoluk İpucu 150 - Sertifika Tabanlı REST Çağrısı Yapmak2017-01-12T21:15:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p>Geçtiğimiz günlerde üzerinde çalıştığımız projede şöyle bir ihtiyaç oldu: Uygulamanın şirket ağı dışındaki bir kuruma ait REST<em>(Representational State Transfer)</em> tabanlı servis noktalarını kullanması gerekiyordu. Bu noktalara göndereceğimiz HTTP Get,Post taleplerine göre bir takım sonuçlar alacak ve kurum içi süreçleri işletecekti. Söz konusu servis ve sunduğu EndPoint'ler ile olan iletişim ise X509 standardındaki bir sertifika üzerinden gerçekleştirilmeliydi. Test ortamında yaptığımız çalışmada, sunucu sertifikasının doğrulanması sonrası devreye girecek Callback operasyonunda hata mesajı aldık. Kurumla yaptığımız mutabakat sonrasında ise bu adımı atlayabileceğimizi öğrendik. Çözüm olarak küçük bir hile yaptık. Nasıl mı? Aynen aşağıdaki fotoğrafta görüldüğü gibi.</p>
<p><img src="https://buraksenyurt.com/image.axd?picture=/2016/12/tfi150.gif" alt="" /></p>
<p>InternalWebClient, WebClient tipinden türetilmiş bir sınıf. Bu nedenle REST servisleri ile iletişim için gerekli temel fonksiyonlara sahip. Önemli olan ise GetWebRequest metodunun ezilmiş<em>(override) </em>olması. Bu fonksiyon bir web kaynağına doğru yapılan çağrılarda devreye giriyor. Metodun içinde ilk olarak HttpWebRequest örneği yakalanıyor. Ardından sertifikayı yüklüyor ve ServerCertificateValidationCallback temsilcisini<em>(delegate)</em> hile yolu ile devre dışı bırakıyoruz<em>(senaryomuzda geriye hep true döndürmek üzere kurgulandı) </em>Böylece InternalWebClient sınıfının tanımlanan ByPassCertValidateCallback özelliğine atanan değere göre sertifika ile ilgili Callback sürecinin atlanması veya atlanmaması sağlanıyor. </p>
<blockquote>
<p>Senaryomuzda WebClient türevli bir sınıf kullanmamızın sebebi, DownloadString DownloadData ve DownloadFile gibi REST servisine yapacağımız çağrı sonrası gelecek içerikleri kolayca almamızı sağlayan metodlar sunmasıydı. Ama sertifika senaryosunda yaşadığımız sorunu aşmak için minik bir takla atıp WebClient sınıfından gelen ve talebin<em>(Request)</em> hazırlandığı sırada devreye giren bir metodun davranışını değiştirmemiz gerekti.</p>
</blockquote>
<p>Böylece geldik bir ipucumuzun daha sonuna. Başka bir ipucunda görüşünceye dek hepinize mutlu günler dilerim.</p>2017-01-12T21:15:00+00:00resttek fotoluk ipucuX509Store X509CertificateswebproxyhttpwebrequestWebClientoverridingbsenyurtGeçtiğimiz günlerde üzerinde çalıştığımız projede şöyle bir ihtiyaç oldu: Uygulamanın şirket ağı dışındaki bir kuruma ait REST(Representational State Transfer) tabanlı servis noktalarını kullanması gerekiyordu. Bu noktalara göndereceğimiz HTTP Get,Post taleplerine göre bir takım sonuçlar alacak ve kurum içi süreçleri işletecekti. Söz konusu servis ve sunduğu EndPoint'ler ile olan iletişim ise X509 standardındaki bir sertifika üzerinden gerçekleştirilmeliydi...https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=666c27c4-8f3b-48b7-bda1-e7c8f1d39c330https://buraksenyurt.com/trackback.axd?id=666c27c4-8f3b-48b7-bda1-e7c8f1d39c33https://buraksenyurt.com/post/tek-fotoluk-ipucu-150-sertifika-tabanli-rest-cagrisi-yapmak#commenthttps://buraksenyurt.com/syndication.axd?post=666c27c4-8f3b-48b7-bda1-e7c8f1d39c33https://buraksenyurt.com/post/tek-fotoluk-ipucu-148-anne-kizlik-soyadini-hash-leyerek-saklayalimTek Fotoluk İpucu 148 - Hassas Bilgiyi Hash'leyerek Saklayalım2016-12-15T21:54:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p>Yazdığımız bir uygulamada kullanıcının anne kızlık soyadı, kimlik numarası, şifre ve benzeri bilgilerini aldığımızı düşünelim. Bir arayüz üzerinden giriliyor olabilirler. Bu bilgileri herhangibir amaçla veritabanında sakladığımızı varsayalım. Şirket güvenlik politikları gereği ilgili bilgiler açık bir şekilde tutulmamalı. Yani anne kızlık soyadı, şifre veya kimlik numarası gözle okunabilir halde tutulmamalı. Buna göre ilgili bilgileri veritabanı üzerinde maskeleyerek<em> s</em>aklamak doğru bir çözüm olabilir. Bunu yapabilmek için akla gelen yollardan birisi de tahmin edileceği üzere Hash algoritmalarına başvurmaktır. Peki güçlü bir Hash algoritması ile bu maskeleme işlemini yapmak ister misiniz? Aşağıdaki fotoğraf size yol gösterebilir.</p>
<p><img src="https://buraksenyurt.com/image.axd?picture=/2016/12/tfi148.gif" alt="" /></p>
<p>RNGCryptoServiceProvider sınıfı bir salt içeriği oluşturulmasında görev alıyor. Bu içerik sonraki aşamada verinin maskelenmesi sırasında kullanılıyor. Salt hash çıktısının benzersiz ve tahmin edilemez olması noktasında önem arz etmekte. Örnekte 48 byte'lık bir salt verisi oluşturuldu ama bu şart değil. Farklı boyutlarda salt içerikleri üretilebilir. Oluşturulan salt Rfc2898DerivedBytes sınıfının yapıcı metoduna parametre olarak geçiliyor. İlk parametrede ise maskelenecek olan içeriğimiz var ki bu örnekte Anne Kızlık Soyadı bilgisini ele alıyoruz. İkinci parametre ise salt değeri. IterationCount özelliğine atanan değer karmaşıklığı arttırmak için veriliyor. İterasyon sayısı fazlalaştıkça algoritma biraz daha karmaşık çalışıyor ve tahmin edilebilirlik ihtimalini düşürüyor diyebiliriz. Maskelenen içeriği yine GetBytes metodu yardımıyla elde ediyoruz. Sonrasında bunu ToBase64String metodu ile string formatta ekrana yazdırmaktayız. Elbette gerçek dünya senaryosunda maskelenen bu string içeriği veritabanına kayıt etmeniz gerekiyor.</p>
<p>Peki ya sonrasında...Müşteri uygulamaya tekrardan giriş yapıp Anne Kızlık Soyadı bilgisini girdiğinde aynı süreç işleyip üretilen maskelenmiş verinin veritabanındaki versiyonu ile karşılaştırması yeterli. Bu iki içerik aynı olduğu takdirde doğru bilgi girmiş olduğunu düşünerek sürecin ilerletilmesini sağlayabiliriz. Ayrıca anne kızlık soyadı sistemin hiç bir noktasında gözle okunabilir formatta dolaşmamış da olur.</p>
<blockquote>
<p>Tabii ekranda bu bilgilerin girildiği kutucukların ve ağ üzerinde bu bilgilerin aktığı hattın güvenliği bambaşka bir konu. Burada servis mesaj içeriklerinin şifrelenerek kullanılması ya da https gibi protokollerin tercih edilmesi doğru bir yaklaşım olabilir. Nitekim hattın güvenli olması ve dinleyen yabancı uygulamaların bu içerikleri görememesi çok önemlidir.</p>
</blockquote>
<p>Tabii örnek sadece nasıl kullanılırı gösteriyor. İlgili fonksiyonelliğin kütüphaneleştirilmesi çok daha doğru olacaktır. Bu görevi siz değerli okurlarıma bırakıyorum. Bir başka tek fotoluk ipucunda görüşmek dileğiyle hepinize mutlu günler dilerim.</p>2016-12-15T21:54:00+00:00tek fotoluk ipucuhashingcryptographysha1bsenyurtYazdığımız bir uygulamada kullanıcının anne kızlık soyadı, kimlik numarası, şifre ve benzeri bilgilerini aldığımızı düşünelim. Bir arayüz üzerinden giriliyor olabilirler. Bu bilgileri herhangibir amaçla veritabanında sakladığımızı varsayalım. Şirket güvenlik politikları gereği ilgili bilgiler açık bir şekilde tutulmamalı. Yani anne kızlık soyadı, şifre veya kimlik numarası gözle okunabilir halde tutulmamalı. Buna göre ilgili bilgileri veritabanı üzerinde maskeleyerek saklamak doğru bir çözüm olabilir. Bunu yapabilmek için akla gelen yollardan birisi de tahmin edileceği üzere Hash algoritmalarına başvurmaktır.https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=445a0c71-3ad9-4953-8f79-4f6133cae5de1https://buraksenyurt.com/trackback.axd?id=445a0c71-3ad9-4953-8f79-4f6133cae5dehttps://buraksenyurt.com/post/tek-fotoluk-ipucu-148-anne-kizlik-soyadini-hash-leyerek-saklayalim#commenthttps://buraksenyurt.com/syndication.axd?post=445a0c71-3ad9-4953-8f79-4f6133cae5de