Parolalar çoğu sistemde doğrudan saklanmaz; bunun yerine tek yönlü bir fonksiyondan geçirilerek elde edilen özetler saklanır. Parola denetimi ya da kurtarma çalışmaları, tahmin edilen adayların özetlerini hesaplayıp kayıtlı değerle karşılaştırır. Hashcat ve John the Ripper bu işlemi hızlandıran güçlü araçlardır; ancak yalnızca sahibi olduğunuz veya test izni aldığınız sistemlerde kullanılmalıdır. Aksi hâlde eğitici görünen bir deneme, hukuki sonuçları olan yetkisiz erişime dönüşebilir.
Devamı...
Kali Linux, siber güvenlik araçlarıyla dolu bir İsviçre çakısı gibidir; ama bu çakıyı cebine kalıcı olarak mı koyacaksın, yoksa gerektiğinde USB’den çıkarıp kullanacak mısın? Bu yazıda Kali’yi diske kurma ve canlı sistem olarak çalıştırma seçeneklerini teorik altyapısıyla inceleyeceğiz. Ama küçük not: Kali güçlü araçlar içerir; yalnızca kendi sistemlerinde, izinli laboratuvarlarda ve etik amaçlarla kullanılmalıdır.
Devamı...
Kali Linux, çoğu kişinin aklına kapüşonlu hacker sahneleri getirse de gerçekte bir “sihirli saldırı kutusu” değil; güvenlik uzmanlarının sistemleri kontrollü, izinli ve ölçülebilir biçimde test etmesi için hazırlanmış bir ofansif güvenlik laboratuvarıdır. Felsefesi basittir: Bir açığı kötü niyetli biri keşfetmeden önce sen bul, kanıtla, raporla ve kapatılmasını sağla.

Devamı...
Bir sistemi güvenli hâle getirmenin ilk adımı, saldırgan gözüyle ne kadar görünür olduğunu anlamaktır. Bilgi toplama, yani footprinting, hedef hakkında alan adları, IP aralıkları, açık portlar, kullanılan teknolojiler, ilişkili e-posta adresleri ve organizasyon yapısı gibi ipuçlarını sistemli biçimde toplamaktır. Elbette bu süreç yalnızca izinli testlerde, kendi laboratuvarında veya kurum içi güvenlik çalışmalarında yapılmalıdır; çünkü aynı teknikler savunma kadar kötüye kullanım için de değerlidir.
Devamı...
Bir ağdan geçen veriler gerçekten görünmez mi? Ne yazık ki hayır. Özellikle şifrelenmemiş protokoller kullanıldığında paketler, aynı ağı paylaşan kötü niyetli kişiler tarafından okunabilir. Wireshark ve Ettercap, yalnızca izinli laboratuvar ortamlarında kullanıldığında bu riski gözlemlemek, paketlerin yapısını öğrenmek ve savunma yöntemlerini test etmek için oldukça güçlü araçlardır.
Devamı...
Modern yazılımlarda işler sırayla değil, çoğu zaman aynı anda olur: kullanıcıdan mesaj gelir, ağdan cevap döner, zamanlayıcı tetiklenir, iptal sinyali ulaşır. Go dilindeki select ifadesi tam bu karmaşada trafik polisi gibi davranır; birden fazla kanalı aynı anda dinler ve hangi kanal hazırsa onu bloklanmadan işleme alır.
Devamı...
Bilgisayarların zar atabildiğini düşünmek tatlı bir yanılsamadır; çünkü işlemcinin içinde minik bir kumarbaz yoktur. Bir programın ürettiği sayı çoğu zaman, sadece iyi gizlenmiş bir düzenin sonucudur. İşte bu yüzden rastgele sayı üretimi, hem yazılım mühendisliğinin pratik bir konusu hem de ‘evren gerçekten öngörülebilir mi?’ sorusuna açılan küçük ama derin bir kapıdır.
Devamı...
Bir Go projesi büyüdükçe kodu tek dosyada tutmak, mutfakta tüm malzemeleri aynı çekmeceye atmaya benzer: başta pratik görünür, sonra tarçınla tornavidayı karıştırırsın. Paket yönetimi ve Go Modules, kodu yeniden kullanılabilir parçalara ayırmayı, dış kütüphaneleri doğru sürümle projeye dahil etmeyi ve aynı projenin farklı makinelerde aynı şekilde çalışmasını sağlar.
Devamı...

Terk edilmiş açık kaynak repoları, yazılım dünyasının tozlu tavan araları gibidir: kırık README’ler, çalışmayan CI rozetleri ve arada bir “Bunu kim, nasıl düşünmüş?” dedirten parlak fikirler. Kod arkeolojisi tam da burada başlar; amaç eski kodu kutsamak değil, içindeki zekice çözümü bugünün diliyle yeniden anlamaktır.
Devamı...

Go ile web sunucusu yazmak, mutfağa girip “Ben bugün internet pişireceğim” demek gibidir: az malzemeyle şaşırtıcı derecede doyurucu sonuç alırsın. Go’nun standart kütüphanesindeki net/http paketi, harici framework kurmadan HTTP isteklerini dinleyen, yönlendiren ve yanıtlayan sade ama güçlü bir sunucu ayağa kaldırmamızı sağlar.
Devamı...
Modern yazılımlar artık tek başına yaşayan küçük adacıklar değil; API’ler, mikroservisler, mobil uygulamalar ve üçüncü parti sistemlerle sürekli konuşan sosyal kelebekler. Go tarafında bu sohbetin en popüler dili JSON’dır. Bir Go yapısını JSON’a çevirmek, valize kıyafet yerleştirmeye benzer: veriyi dış dünyaya taşınabilir, okunabilir ve standart bir forma sokarız. Gelen JSON’u tekrar Go struct’ına çözmek ise valizi açıp eşyaları doğru çekmecelere yerleştirmektir.
Devamı...
Bir programın dış dünyayla konuşmasının en eski ama en vazgeçilmez yolu dosyalardır. Günlük tutan bir uygulama, JSON ayarı okuyan bir oyun, CSV raporu üreten bir analiz aracı ya da büyük veri parçasını satır satır işleyen bir servis… Hepsi aslında aynı soruyu sorar: Veriyi güvenli, hızlı ve anlaşılır biçimde nasıl okur/yazarım?

Devamı...

Kod yazmak bazen Lego yapmak gibidir: Parçalar tek tek güzel görünür ama kuleyi kaldırınca ortadan ikiye ayrılıyorsa bir yerde hata vardır. Birim testleri, bu Lego parçalarının tek başına sağlam olup olmadığını kontrol eder. Profil analizi ise aynı parçaların ne kadar hızlı, ne kadar bellekle ve hangi maliyetle çalıştığını gösterir. Yani biri doğruluk dedektifi, diğeri performans dedektifidir.
Devamı...

Programlamada bazen bir şeyi nesne gibi davranışlarıyla değil, taşıdığı verilerle düşünmek daha doğrudur. İşte yapılar, yani structs, tam bu noktada sahneye çıkar. Bir koordinat, renk, sağlık değeri, tarih aralığı veya fiziksel hız vektörü düşünün: Bunlar genellikle küçük, anlamlı ve birlikte taşınması gereken veri paketleridir. Struct, farklı tiplerdeki alanları mantıksal bir bütün halinde gruplar ve özellikle veri odaklı tasarımda gereksiz soyutlama sisini dağıtarak işlemciye daha dost bir programlama modeli sunar.
Devamı...
Bir programın gerçek dünyayla ilk teması genellikle bir hatadır: dosya yoktur, ağ isteği zaman aşımına uğrar, kullanıcı sayı yerine “patates” yazar. Bazı diller bu anlarda istisna fırlatıp akışı dramatik biçimde keserken, Go gibi yaklaşımlar hatayı sıradan bir değer olarak masaya koyar. Yani hata, programın çökmesine çalışan bir canavar değil; kontrol edilmesi gereken bir dönüş değeridir.
Devamı...

Bir veri koleksiyonunu düşün: Elinde bir öğrenci listesi var ama öğrencileri 0, 1, 2 gibi indekslerle değil, okul numarası, e-posta adresi veya kullanıcı adı gibi anlamlı anahtarlarla bulmak istiyorsun. İşte haritalar, yani Maps, tam bu noktada sahneye çıkar. Map yapısı, veriyi anahtar-değer çifti olarak saklar ve arama, ekleme, silme gibi işlemleri oldukça okunabilir hale getirir.
Devamı...
Go’da bir struct yalnızca veri taşımak zorunda değildir; ona metotlar bağlayarak belirli davranışlar kazandırabiliriz. Bu yaklaşım, klasik sınıf tabanlı nesne yönelimli programlamadan farklıdır: Go’da class, kalıtım veya this yoktur; bunun yerine sade, açık ve güçlü bir receiver mantığı vardır.
Devamı...
Go dünyasında goroutine’ler sahneye çıktığında ortalık bir anda kalabalıklaşır: aynı anda çalışan fonksiyonlar, paralel iş akışları ve bolca hız! Fakat hızın yanında klasik bir soru gelir: Bu çalışan parçalar birbirleriyle nasıl güvenli konuşacak? Go’nun cevabı nettir: Belleği paylaşarak iletişim kurma; iletişim kurarak belleği paylaş.

Devamı...
Bilgisayarlarımız artık tek bir hızlı çekirdekten ibaret değil; çoğu makinede birden fazla çekirdek sessizce iş bekliyor. Go dilinin goroutine yaklaşımı tam da burada devreye girer: işletim sistemi iş parçacıklarına göre çok daha hafif görevler başlatarak aynı anda birçok işi düzenli, okunabilir ve verimli biçimde yürütmemizi sağlar.
Devamı...
Bir veri koleksiyonunu saklamak istediğimizde aklımıza ilk gelen yapı genellikle dizidir; ama Go gibi dillerde sahneye bir de dilimler, yani slices çıkar. Dizi, bellekte yan yana duran sabit sayıda kutu gibidir; dilim ise bu kutuların tamamını ya da bir bölümünü gösteren akıllı bir pencere. Aralarındaki farkı anlamak, sadece sözdizimini değil, performans ve bellek davranışını da doğru okumayı sağlar.
Devamı...