__    __                      __                        __ 
  /  |  /  |                    /  |                      /  |
  $$ |  $$ |  ______    _______ $$ |   __   ______    ____$$ |
  $$ |__$$ | /      \  /       |$$ |  /  | /      \  /    $$ |
  $$    $$ | $$$$$$  |/$$$$$$$/ $$ |_/$$/ /$$$$$$  |/$$$$$$$ |
  $$$$$$$$ | /    $$ |$$ |      $$   $$<  $$ |  $$ |$$ |  $$ |
  $$ |  $$ |/$$$$$$$ |$$ \_____ $$$$$$  \ $$ \__$$ |$$ \__$$ |
  $$ |  $$ |$$    $$ |$$       |$$ | $$  |$$    $$/ $$    $$ |
  $$/   $$/  $$$$$$$/  $$$$$$$/ $$/   $$/  $$$$$$/   $$$$$$$/ 
  
                                                                          
               

NodeJS ile Veri Şifreleme için Başlangıç Kılavuzu

Web geliştirme, şifreleme olmadan hayatta kalamaz. Web uygulamaları, insanlara, kuruluşlara ve hükümetlere ait büyük miktarlarda hassas verilere erişim sağladıkça, veri güvenliğine yönelik tehditler tüm zamanların en yüksek seviyesine ulaşmıştır. Programcılar, verileri kötü niyetli kişilere karşı korumak için kriptografi ve şifreleme tekniklerini kullanmışlardır, özellikle internetin yaygınlaşmasıyla bu teknikler daha da önem kazanmıştır.

Web geliştirmede, kriptografi genellikle verilerin ağ üzerinden aktarımı sırasında veya veritabanlarında saklanırken güvenliğini sağlamak için kullanılır. Şifreleme işlemleri çoğunlukla web arka ucunda gerçekleştirilir. Bir Node geliştiricisi olarak, sisteminizde işlenen verilerin güvenliğini sağlamak adına, şifreleme ve şifre çözme tekniklerini anlamanız gerekmektedir.

Bu makale, web geliştirmede kullanılan temel şifreleme tekniklerini ve bunların Node.js ile nasıl uygulanacağını inceleyecektir. Node.js, [crypto](https://nodejs.org/api/crypto.html) adlı yerleşik bir modül sayesinde bu görevleri kolaylıkla gerçekleştirmenizi sağlar.

Kriptografi nedir?

Kriptografi, verileri güvende tutmak için tekniklerle ilgilenen bir çalışma alanıdır. Kriptografi, verileri, doğru kimlik bilgilerine sahip olmayanların anlayamayacağı veya ilk biçimine döndüremeyeceği bir hale dönüştürür.

Şifreleme sürecinde üç önemli bileşen bulunur: düz metin, şifreli metin ve bir algoritma. Şifreleme algoritması, düz metni, karışık ve tanınmayan bir forma dönüştürür. Bu dönüşüm için algoritma, matematiksel hesaplamalar kullanır.

Kriptografik algoritmalar genellikle bir anahtar kullanır. Şifreli metni düz metne dönüştürmek, doğru anahtarın olması durumunda mümkündür. Bu nedenle, düz metni görüntüleme yetkisine sahip kişiler, anahtarı güvende tutmalıdır.

Şifreleme nedir?

Şifreleme, düz metni şifreli metne dönüştürme işlemidir ve kriptografinin sadece bir yönünü oluşturur. Şifre çözme ise, şifreli metni düz metne dönüştürme işlemidir.

Kriptografi türleri

Üç temel şifreleme türü vardır: simetrik anahtarlı şifreleme, asimetrik anahtarlı şifreleme ve karma (hashing). Her birinin önemini aşağıda inceleyeceğiz.

Simetrik anahtarlı şifreleme (symmetric-key cryptography)

Simetrik anahtarlı şifrelemede, şifreleme ve şifre çözme için kullanılan anahtar aynıdır. Bu yöntem hızlıdır ancak güvenlik sorunlarına sahiptir çünkü anahtarın güvenli bir şekilde paylaşılması gerekmektedir.

Asimetrik anahtarlı şifreleme (asymmetric-key cryptography)

Asimetrik şifreleme, public ve private olmak üzere iki anahtar kullanır. Public anahtar şifreleme için, private anahtar ise şifre çözme için kullanılır. Bu yöntem, simetrik anahtarlı şifrelemenin güvenlik sorunlarını çözer.

Karma (Hashing)

Hashing, düz metni benzersiz bir şifreli metne dönüştürür. Hashing ile düz metin geri dönüştürülemez, bu yüzden genellikle parolaların saklanmasında kullanılır.

Node.js ile Şifreleme

Node.js, kriptografik işlemleri gerçekleştirmek için yerleşik bir kripto modülü sağlar. Bu bölümde, Node.js'in kripto modülünü kullanarak şifrelemenin nasıl uygulanacağını öğreneceksiniz.

Node.js ile Verileri Şifreleme

Verileri şifrelemek için, kripto modülünün Cipher sınıfını kullanabiliriz. Aşağıdaki örnek, Node.js ile nasıl veri şifreleneceğini gösterir:

const crypto = require("crypto");

const algorithm = "aes-192-cbc";

const encrypt = (text) => {
  crypto.scrypt(process.env.SECRET, 'salt', 24, (err, key) => {
    if (err) throw err;
    crypto.randomFill(new Uint8Array(16), (err, iv) => {
      if (err) throw err;
      const cipher = crypto.createCipheriv(algorithm, key, iv);
      let encrypted = '';
      cipher.setEncoding('hex');
      cipher.on('data', (chunk) => encrypted += chunk);
      cipher.on('end', () => console.log(encrypted));
      cipher.on('error', (err) => console.log(err));
      cipher.write(text);
      cipher.end();
    });
  });
};

encrypt('hello World');

Crypto modülü, her şifreleme çağrısında yeni bir anahtar oluşturma imkanı sunar, bu da kaba kuvvet saldırılarını zorlaştırır. Ancak, şifreleme ve şifre çözme işlemleri için kullanılan ortak secret, şifre çözme tarafının erişimine açık olmalıdır.

Kullanılan AES algoritması, 192 bit anahtar uzunluğu ile güvenli bir şifreleme sağlar. IV, şifreli metindeki tekrarları önlemek için kullanılır ve her zaman öngörülemez ve benzersiz olmalıdır.

Node.js ile Verilerin Şifresini Çözme

Verilerin şifresini çözmek için, Decipher sınıfını kullanırız. Şifre çözme işlemi, şifreleme işlemine benzer şekilde gerçekleştirilir:

const decrypt = (encrypted, iv) => {
  crypto.scrypt(process.env.SECRET, 'salt', 24, (err, key) => {
    if (err) throw err;
    const decipher = crypto.createDecipheriv(algorithm, key, iv);
    let decrypted = '';
    decipher.on('readable', () => {
      while (null !== (chunk = decipher.read())) {
        decrypted += chunk.toString('utf8');
      }
    });
    decipher.on('end', () => console.log(decrypted));
    decipher.on('error', (err) => console.log(err));
    decipher.write(encrypted, 'hex');
    decipher.end();
  })
};

Şifre çözme işleminde kullanılan IV, şifreleme sırasında kullanılan IV ile aynı olmalıdır.

Node.js ile Hashing

Kripto modülü kullanarak bir hashing işlevi uygulamak basittir. Aşağıda, basit bir hash fonksiyonu örneği verilmiştir:

const hash = text => {
  const hash = crypto.createHash('sha256');
  hash.on('readable', () => {
    const data = hash.read();
    if (data) {
      console.log(data.toString('hex'));
    }
  });
  hash.write(text);
  hash.end();
}

Bu uygulamada, sha256 hashing algoritması kullanılmıştır. Bu algoritma, veriyi hashlemek için write işlevi ile kolaylıkla kullanılabilir. Veride hash oluşturulduğunda, readable olayı tetiklenir ve hash değeri elde edilir.

Özet

Bu makalede, kriptografi ve veri şifrelemenin temellerini ele aldık. Node.js'in yerleşik kripto modülü kullanılarak nasıl kriptografik işlemler gerçekleştirileceğini inceledik. Veri şifreleme, web uygulamaları geliştirmek için kritik öneme sahiptir. Bu bilgileri kullanarak gelecekte daha güvenli uygulamalar oluşturabilirsiniz. Node.js kripto modülü tarafından desteklenen diğer şifreleme işlem türleri hakkında daha fazla bilgi için, Node.js'in resmi belgelerini okuyabilirsiniz.

Kriptografi, geniş ve büyüleyici bir alanı kapsar. Bahsedilenler dışında daha birçok veri koruma yöntemi vardır. Web geliştirici olarak bu yöntemleri ne kadar iyi bilirseniz, o kadar iyi uygulamalar oluşturabilirsiniz. Bu nedenle, şifreleme ve kriptografi hakkında öğrenmeye devam edin, kendi araştırmanızı yapın ve daha fazlasını öğrenin.

Burası Hackod.