"Enter"a basıp içeriğe geçin

Yazar: Emrah Emrem

AES Nedir ?

AES (Advanced Encryption Standard), verilerin gizliliğini sağlamak için kullanılan bir simetrik anahtar şifreleme algoritmasıdır. AES anahtarları 128, 192 ve 256 bit uzunluklara sahiptir.

AES’in Avantajları

  1. Yüksek Güvenlik: AES, birçok güvenlik testi ve analizden geçmiştir ve şu anda saldırılara karşı dayanıklıdır.
  2. Hız: Hem yazılım hem de donanım uygulamalarında çok hızlıdır.
  3. Esneklik: Farklı anahtar uzunlukları sunarak çeşitli güvenlik gereksinimlerini karşılar.
  4. Standart: Dünya genelinde birçok güvenlik protokolü ve sistemde standart olarak kullanılır (ör. HTTPS, VPN, Wi-Fi Güvenliği).

Java kodunda AES ile ilgili kısa bir şifreleme örneğini aşağıda görebilirsiniz.

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;

public class AESOperation {
    // AES şifreleme metodu
    public static String encrypt(String plainText, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes); // Base64 ile okunabilir formata çevir
    }

    // AES şifre çözme metodu
    public static String decrypt(String encryptedText, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
        return new String(decryptedBytes);
    }

    public static void main(String[] args) {
        try {
            // 1. AES anahtarı oluştur
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            keyGenerator.init(128); // 128 bitlik anahtar oluştur
            SecretKey secretKey = keyGenerator.generateKey();

            // 2. Şifrelenecek metin
            String originalText = "Hello World!";
            System.out.println("Original Text: " + originalText);

            // 3. Şifreleme
            String encryptedText = encrypt(originalText, secretKey);
            System.out.println("Encrypted Text: " + encryptedText);

            // 4. Şifre Çözme
            String decryptedText = decrypt(encryptedText, secretKey);
            System.out.println("Decrypted Text: " + decryptedText);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Yorum Bırak

RSA Nedir ?

RSA (Rivest-Shamir-Adleman), adını geliştiricilerinden alan ve günümüzde en yaygın kullanılan asimetrik şifreleme algoritmalarından biridir. RSA’da iki anahtar kullanılır:

  • Açık Anahtar (Public Key): Şifreleme ve doğrulama için kullanılır, herkesle paylaşılabilir.
  • Özel Anahtar (Private Key): Şifre çözme ve imzalama için kullanılır, gizli tutulur.

Bu anahtar çiftleri, büyük asal sayıların matematiksel ilişkilerine dayanmaktadır.

Avantajlar:

  • Güçlü bir güvenlik sağlar.
  • Açık ve özel anahtar ayrımı ile anahtar yönetimi kolaydır.
  • Dijital imza ve şifreleme işlemlerini aynı anda yapabilir.

Dezavantajlar:

  • Simetrik algoritmalara göre çok daha yavaştır.
  • Kuantum bilgisayarların yaygınlaşması durumunda güvenliği tehlikeye girebilir.

Java kodunda RSA ile ilgili kısa bir şifreleme örneğini aşağıda görebilirsiniz.

import java.security.*;
import javax.crypto.Cipher;
import java.util.Base64;

public class RSAOperation{

    // Anahtar çiftlerini oluşturma
    public static KeyPair generateKeyPair() throws Exception {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(2048); // 2048 bitlik anahtar uzunluğu
        return keyGen.generateKeyPair();
    }

    // Veriyi şifreleme
    public static String encrypt(String plainText, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    // Veriyi çözme
    public static String decrypt(String encryptedText, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
        return new String(decryptedBytes);
    }

    public static void main(String[] args) {
        try {
            // Anahtarları oluştur
            KeyPair keyPair = generateKeyPair();
            PublicKey publicKey = keyPair.getPublic();
            PrivateKey privateKey = keyPair.getPrivate();

            // Şifrelenecek metin
            String originalText = "Hello World!";
            System.out.println("Original Text: " + originalText);

            // Şifreleme
            String encryptedText = encrypt(originalText, publicKey);
            System.out.println("Encrypted Text: " + encryptedText);

            // Şifre çözme
            String decryptedText = decrypt(encryptedText, privateKey);
            System.out.println("Decrypted Text: " + decryptedText);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Yorum Bırak

Kriptografi Nedir ?

Kriptografi, bilginin gizliliğini, bütünlüğünü ve doğruluğunu sağlamak için matematiksel ve algoritmik yöntemlere dayanan bir bilim dalıdır. Özellikle dijital iletişimde güvenliği artırmak amacıyla hem teorik hem de uygulamalı yönleriyle kullanılır.

Kriptografinin temel amacı, verilerin gizliliğini, bütünlüğünü ve doğruluğunu korumaktır. Tarihi antik döneme kadar uzanan bu disiplin, başlangıçta Sezar Şifreleme (Caesar Cipher) gibi basit yöntemlerle başlamış, orta çağlarda daha karmaşık hale gelmiştir. 20. yüzyılın başlarında ise Enigma makinesi gibi cihazlarla şifreleme teknolojisi daha da gelişmiştir. Günümüzde matematiksel yöntemlere dayalı dijital kriptografi yaygın olarak kullanılmaktadır.

Modern kriptografi yöntemleri üç ana kategoriye ayrılır:

  1. Simetrik Anahtar Kriptografi (Symmetric Key Cryptography):
    • Şifreleme ve çözme için aynı anahtar kullanılır.
    • Örnek Algoritmalar: AES, DES, 3DES, FPE
    • Avantajı: Hızlıdır.
    • Dezavantajı: Anahtar paylaşımı sorunu vardır.
  2. Asimetrik Anahtar Kriptografi (Asymmetric Key Cryptography):
    • İki anahtar kullanılır: Herkesin erişebileceği bir açık anahtar (public key) ve gizli tutulması gereken bir özel anahtar (private key).
    • Örnek Algoritmalar: RSA, ECC
    • Avantajı: Anahtar paylaşımı sorununu çözer.
    • Dezavantajı: Simetrik şifrelemeye göre daha yavaştır.
  3. Hash Fonksiyonları:
    • Bilgiyi şifrelemez, sabit uzunlukta bir özet (hash) üretir.
    • Tek yönlüdür, yani geri çevrilemez.
    • Örnek Algoritmalar: SHA-256, MD5, SHA-3.
    • Kullanım Alanları: Veri bütünlüğü, dijital imzalar.

Kriptografinin günümüzde yaygın olarak kullanıldığı yerler;

  • İletişim Güvenliği:  E-posta şifreleme (PGP, S/MIME), SSL/TLS protokolleri (HTTPS).
  • Veri Depolama Güvenliği: Şifreli diskler (BitLocker, FileVault), Bulut veri şifreleme
  • Kimlik Doğrulama ve Yetkilendirme: OTP (One-Time Password) sistemleri, Blockchain teknolojileri
  • Finansal Sistemler: Kripto paralar (Bitcoin, Ethereum), Dijital ödemeler (Apple Pay, Google Pay).
Yorum Bırak

Merge Sorting

Merge Sorting (Birleştirme Sıralaması), “böl ve fethet” (divide and conquer) prensibine dayanan bir sıralama algoritmasıdır. Bu algoritma, bir diziyi ikiye böler, her bir yarıyı ayrı ayrı sıralar ve ardından sıralı yarıları birleştirir. Merge Sort, kararlı bir algoritmadır ve en kötü durumda bile O(n log n) zaman karmaşıklığına sahiptir, bu da onu oldukça verimli bir sıralama algoritması yapar. Java dili ile yazılmış bubble sorting algoritma örneğini aşağıda görebilirsiniz.

public static void mergeSorting(int[] arr) {
        if (arr.length < 2) {
            return;
        }
        int mid = arr.length / 2;
        int[] left = new int[mid];
        int[] right = new int[arr.length - mid];

        // Sol ve sağ diziyi oluştur
        System.arraycopy(arr, 0, left, 0, mid);
        System.arraycopy(arr, mid, right, 0, arr.length - mid);

        // Sol ve sağ yarıyı sıralama
        mergeSorting(left);
        mergeSorting(right);

        // Birleştirme
        merge(arr, left, right);
    }

    private static void merge(int[] arr, int[] left, int[] right) {
        int i = 0, j = 0, k = 0;
        while (i < left.length && j < right.length) {
            arr[k++] = (left[i] <= right[j]) ? left[i++] : right[j++];
        }
        while (i < left.length) {
            arr[k++] = left[i++];
        }
        while (j < right.length) {
            arr[k++] = right[j++];
        }
    }
public static void main(String [] args) {
        int[] array = { 24, 16, 35, 34, 10 };
        mergeSorting(array);
}

Resim Referansı: https://en.m.wikipedia.org/wiki/File:Merge-sort-example-300px.gif

Yorum Bırak

Counting Sorting

Counting Sorting, belirli bir aralıktaki tam sayıların sıralanması için kullanılan, karşılaştırma tabanlı olmayan bir sıralama algoritmasıdır. Algoritma, her sayının kaç kez geçtiğini sayarak çalışır ve bu sayımlara dayanarak sıralama işlemi gerçekleştirilir. Counting Sort, lineer zaman karmaşıklığına sahip olabilir, ancak yalnızca belirli bir aralıktaki sayılar üzerinde etkili çalışır. En iyi durum, en kötü durum ve ortalama durum: O(n + k), burada n dizi eleman sayısı, k ise elemanların alabileceği değerlerin aralığıdır (en büyük değere kadar). Java dili ile yazılmış bubble sorting algoritma örneğini aşağıda görebilirsiniz.

public static void countingSorting(int[] arr) {
        int n = arr.length;
        int max = Arrays.stream(arr).max().getAsInt();
        int[] count = new int[max + 1];
        Arrays.fill(count, 0);
        for (int i = 0; i < n; i++) {
            count[arr[i]]++;
        }
        for (int i = 1; i <= max; i++) {
            count[i] += count[i - 1];
        }
        int[] output = new int[n];
        for (int i = n - 1; i >= 0; i--) {
            output[count[arr[i]] - 1] = arr[i];
            count[arr[i]]--;
        }
        for (int i = 0; i < n; i++) {
            arr[i] = output[i];
        }
    }
public static void main(String [] args) {
        int[] array = { 24, 16, 35, 34, 10 };
        countingSorting(array);
}

Resim Referansı: https://gabrielghe.github.io/university/2016/03/09/counting-sort

Yorum Bırak

Bubble Sorting

Bubble Sorting, bitişik elemanları karşılaştırarak çalışır ve gerektiğinde yer değiştirir. En büyük eleman her adımda listenin sonuna “kabarcık” gibi çıkar. Basit ama genellikle verimsizdir ve O(n^2) sürede çalışmaktadır. Java dili ile yazılmış bubble sorting algoritma örneğini aşağıda görebilirsiniz.

public static void bubbleSorting(int[] arr) {
        int n = arr.length;
        boolean swapped;
        for (int i = 0; i < n-1; i++) {
            swapped = false;
            for (int j = 0; j < n-i-1; j++) {
                if (arr[j] > arr[j+1]) {
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                    swapped = true;
                }
            }
            if (!swapped)
                break;
        }
    }
public static void main(String [] args) {
        int[] array = { 24, 16, 35, 34, 10 };
        bubbleSorting(array);
}

Resim Referansı: http://www.xybernetics.com/techtalk/SortingAlgorithmsExplained/SortingAlgorithmsExplained.html

Yorum Bırak

Selection Sorting

Selection sort, basit ve anlaşılması kolay bir sıralama algoritmasıdır. En iyi, en kötü ve ortalama durumda O(n²) zaman karmaşıklığına sahiptir ve alan karmaşıklığı için O(1) kullanılmaktadır. Ayrıca selection sort stabil bir algoritma değildir. Aşağıda java dili ile yazılmış selection sorting algoritma örneğini görebilirsiniz.

 

public static int[] selectionSorting(int[] array) {
        for (int i = 0; i < array.length; i++) {
            int minIndex = i;
            for (int j = i+1; j < array.length; j++) {
                if (array[j] < array[minIndex]) {
                    minIndex = j;
                }
            }

            int temp = array[minIndex];
            array[minIndex] = array[i];
            array[i] = temp;
        }
        return array;
    }
public static void main(String [] args) {
        int[] array = { 24, 16, 35, 34, 10 };
        selectionSorting(array);
    }

Resim Referansı: https://dev.to/arkardev/iterative-sorting-algorithms-in-javascript-305l

Yorum Bırak

Insertion Sorting

Insertion sort, sıralama algoritmalarından biridir ve genellikle küçük veri kümeleri için kullanılır. Ortalama ve en kötü durumda O(n²) karmaşıklığına sahiptir ve alan karmaşıklığı için O(1) kullanılmaktadır. Ayrıca insertion sort stabil bir algoritmadır. Aşağıda java dili ile yazılmış insertion sorting algoritma örneğini görebilirsiniz.

 

public static int[] insertionSorting(int[] array) {
        for (int i = 1; i < array.length; i++) {
            int key = array[i];
            int j = i - 1;
            while (j >= 0 && array[j] > key) {
                array[j + 1] = array[j];
                j = j - 1;
            }
            array[j + 1] = key;
        }
        return array;
 }
public static void main(String [] args) {
        int[] array = { 24, 16, 35, 34, 10 };
        insertionSorting(array);
    }

Resim Referansı: https://thinkdiff.net/insertion-sort-swift-db14b9a79016

Yorum Bırak

Geri Bildirim Almak/Vermek Nedir?

Geri bildirim almak, başkalarının düşüncelerini, duygularını veya performansınız hakkında bilgi edinmektir.

Geri bildirim vermek ise, başkalarına açık ve yapıcı bir şekilde geri bildirimde bulunmaktır, ki bu genellikle bir süreç veya davranışın iyileştirilmesine veya geliştirilmesine yardımcı olur.

Elbette ki, geri bildirim almak ve vermek, kişisel ve profesyonel gelişim için son derece önemli bir süreçtir. Her iki konu hakkında bilgi verecek olursak:

Geri Bildirim Almak

  1. Açık Olmak: Geri bildirim almak için öncelikle açık olmalısınız. Başkalarının düşüncelerini ve görüşlerini duymaya hazır olmalısınız. Örnek verecek olursak.

    Bir proje sunumu yaptınız ve ekibinizden geri bildirim almak istiyorsunuz. Sunum sonrasında, ekibinizin düşüncelerini açıkça ifade etmeleri için bir toplantı düzenlersiniz.

  2. Empati Kurmak: Karşı tarafın bakış açısını anlamak önemlidir. Geri bildirim veren kişinin niyetini anlamak ve empati kurmak, geri bildirimi daha etkili hale getirebilir. Örnek verecek olursak.

    Bir müşteri, hizmetinizden memnun olmadığını belirten bir e-posta gönderdi. Empati kurarak müşterinin deneyimini anlamaya çalışırsınız ve onun endişelerini çözmek için adımlar atarsınız.

  3. Yapıcı Olmak: Aldığınız geri bildirimi kişisel olarak almamalı ve savunmaya geçmemelisiniz. Bunun yerine, geri bildirimi bir fırsat olarak görmeli ve kendinizi geliştirmek için kullanmalısınız. Örnek verecek olursak.

    Performans değerlendirmenizde bir zayıf noktanızın olduğunu öğrendiniz. Bunun üzerine, bu konuda eğitim almak veya becerilerinizi geliştirmek için bir plan yaparsınız.

  4. Teşekkür Etmek: Geri bildirimi veren kişiye teşekkür etmek, onların zamanlarını ve düşüncelerini değerli gördüğünüzü gösterir. Bu, gelecekte daha fazla geri bildirim almanızı sağlayabilir. Örnek verecek olursak.

    Bir iş toplantısında, bir meslektaşınız size yapıcı bir geri bildirim verir. Kendisine teşekkür eder ve değerli geri bildirimi için minnettar olduğunuzu belirtirsiniz.

  5. Eyleme Geçmek: Aldığınız geri bildirimi değerlendirip, gerektiğinde eyleme geçmelisiniz. Geri bildirim almak sadece dinlemekle kalmamalı, aynı zamanda iyileştirme veya değişim için adımlar atmalısınız. Örnek verecek olursak.

    Bir müşteri anketi sonuçlarına göre, ürününüzün belirli bir özelliği kullanıcılar için karmaşık olduğunu öğrenirsiniz. Bu geri bildirimi dikkate alarak kullanıcı deneyimini iyileştirmek için bir çalışma grubu oluşturursunuz.

Geri Bildirim Vermek

  1. Doğru Zamanda Vermek: Geri bildirim vermek için uygun bir zamanı seçmek önemlidir. Duygusal olmayan bir ortamda, kişisel olmayan bir dil kullanarak geri bildirim vermek etkili olabilir. Örnek verecek olursak.

    Bir proje toplantısında, bir ekip üyesinin sunumuyla ilgili bazı iyileştirme önerilerinizi paylaşırsınız. Ancak bunu yaparken, sunum sonrasında yapıcı bir şekilde geri bildirim vermek için bir araya gelirsiniz.

  2. Somut ve Spesifik Olmak: Genellemelerden kaçının ve geri bildiriminizi somut ve spesifik hale getirin. Örnekler vererek geri bildiriminizi destekleyin. Örnek verecek olursak.

    Bir stajyerin iş performansını değerlendirirken, işin belirli bir bölümünde daha fazla dikkat göstermesi gerektiğini ve örneklerle bunu desteklersiniz.

  3. Yapıcı Olmak: Geri bildirimi verirken yapıcı olun. Kişinin gelişimine katkıda bulunacak öneriler sunun ve olumlu noktalara da değinin. Örnek verecek olursak.

    Bir iş arkadaşınızın belirli bir proje üzerindeki katkılarını değerlendirirken, olumlu yönlerini takdir ederken, aynı zamanda gelişim için önerilerde bulunursunuz.

  4. Dinlemek: Geri bildirim vermek sadece konuşmak değil, aynı zamanda dinlemek de önemlidir. Karşı tarafın tepkilerini ve duygularını anlamak için dinlemeye özen gösterin. Örnek verecek olursak.

    Bir takım üyesi, bir projenin planlanmasıyla ilgili bir fikir önerir. Siz de bu fikri dinlersiniz, onu ciddiye alırsınız ve olumlu yönlerini övdükten sonra, geliştirme önerilerinizi paylaşırsınız.

  5. İletişim Tarzını Dikkate Almak: Herkes farklı iletişim tarzlarına sahiptir. Karşı tarafın iletişim tarzını dikkate alarak geri bildirimi ona uygun bir şekilde iletmek önemlidir. Örnek verecek olursak.

    Bir iş toplantısında, herkesin farklı bir iletişim tarzına sahip olduğunu bilerek, geri bildirim verirken herkesin anlayabileceği bir dil kullanırsınız ve duyarlı bir şekilde iletişim kurarsınız.

Geri bildirim almak ve vermek, kişisel ve profesyonel gelişim için önemli bir süreç olduğu gibi, ilişkilerin de güçlenmesine yardımcı olacaktır. İletişimde ve geri bildirimde zamanında olması çok önemlidir. Zamanında verilmeyen geri bildirimler eksik veya etkisiz olabilir.

Ne demiş atalarımız 🙂

Geç kalan söz, eksik kalan sözdür

Yorum Bırak

Adapter Design Pattern

Adapter Design Pattern: Bir sınıfın arayüzünü, beklenen bir arayüze çevirir. Farklı arayüzlere sahip sınıfların birlikte çalışmasını sağlar. Örnek verecek olursak;

public interface Database {

    void select(String data);

    void insert(String data);

    void update(String data);

    void delete(String data);
}
public class SqlDatabase implements Database{
    @Override
    public void select(String data) {
        System.out.println("Selecting data from SQL database with query : "+ data);
    }

    @Override
    public void insert(String data) {
        System.out.println("Inserting data into SQL database : "+ data);
    }

    @Override
    public void update(String data) {
        System.out.println("Updating data in SQL database : "+ data);
    }

    @Override
    public void delete(String data) {
        System.out.println("Deleting data from SQL database : "+ data);
    }
}
public class MongoDatabase {
    public void findDocument(String jsonQuery) {
        System.out.println("Finding document in MongoDB with query: " + jsonQuery);
    }

    public void insertDocument(String json) {
        System.out.println("Inserting document into MongoDB: " + json);
    }

    public void updateDocument(String json) {
        System.out.println("Updating document in MongoDB:" + json);
    }

    public void deleteDocument(String json) {
        System.out.println("Deleting document from MongoDB:" + json);
    }
}
public class MongoToSqlAdapter implements Database {

    private MongoDatabase mongoDatabase;

    public MongoToSqlAdapter(MongoDatabase mongoDatabase) {
        this.mongoDatabase = mongoDatabase;
    }

    @Override
    public void select(String data) {
        mongoDatabase.findDocument(data);
    }

    @Override
    public void insert(String data) {
        mongoDatabase.insertDocument(data);
    }

    @Override
    public void update(String data) {
        mongoDatabase.updateDocument(data);
    }

    @Override
    public void delete(String data) {
        mongoDatabase.deleteDocument(data);
    }
}
  public static void main(String[] args) {
        // SQL database operation
        Database sqlDatabase = new SqlDatabase();
        sqlDatabase.insert("SqlDatabase Data");
        sqlDatabase.update("SqlDatabase Data");
        sqlDatabase.delete("SqlDatabase Data");
        sqlDatabase.select("SELECT * FROM SqlDatabase Table");

        // MongoDB database operation
        MongoDatabase mongoDatabase = new MongoDatabase();
        Database mongoToSqlAdapter = new MongoToSqlAdapter(mongoDatabase);
        mongoToSqlAdapter.insert("Mongo Data");
        mongoToSqlAdapter.update("Mongo Data");
        mongoToSqlAdapter.delete("Mongo Data");
        mongoToSqlAdapter.select("SELECT * FROM mongoTable");
   }

Örnekte, MongoToSqlAdapter sınıfı, MongoDatabase sınıfını Database arayüzüne uyarlayarak MongoDB’nin SQL veritabanı gibi kullanılmasını sağlıyor. Bu sayede, her iki database türüyle uyumlu hale gelmiş oluyor.

Yorum Bırak