{"id":31611,"date":"2025-10-11T22:41:13","date_gmt":"2025-10-11T19:41:13","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31611"},"modified":"2025-10-11T22:41:13","modified_gmt":"2025-10-11T19:41:13","slug":"javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/","title":{"rendered":"JavaScript&#8217;te Bcrypt.js ile Parolalar\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme"},"content":{"rendered":"<p><body><\/p>\n<h2>JavaScript&#8217;te Bcrypt.js ile Parolalar\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme<\/h2>\n<p>Parola g\u00fcvenli\u011fi, modern web uygulamalar\u0131n\u0131n ve genel olarak dijital g\u00fcvenli\u011fin temel ta\u015flar\u0131ndan biridir. Kullan\u0131c\u0131 verilerini koruman\u0131n en kritik yollar\u0131ndan biri, parolalar\u0131 do\u011fru ve g\u00fcvenli bir \u015fekilde depolamakt\u0131r. Aksi takdirde, bir veri ihlali durumunda kullan\u0131c\u0131lar\u0131n parolalar\u0131 a\u00e7\u0131\u011fa \u00e7\u0131kabilir ve bu da kimlik av\u0131, di\u011fer hesaplara yetkisiz eri\u015fim gibi ciddi sonu\u00e7lara yol a\u00e7abilir. Bu makalede, JavaScript tabanl\u0131 uygulamalar\u0131n\u0131zda (\u00f6zellikle Node.js ortam\u0131nda) parolalar\u0131 g\u00fcvenli bir \u015fekilde y\u00f6netmek i\u00e7in neden ve nas\u0131l <code>bcrypt.js<\/code> k\u00fct\u00fcphanesini kullanman\u0131z gerekti\u011fini ayr\u0131nt\u0131l\u0131 olarak ele alaca\u011f\u0131z.<\/p>\n<h3>Parola G\u00fcvenli\u011finin \u00d6nemi ve Yayg\u0131n Hatalar<\/h3>\n<p>Parolalar, bir kullan\u0131c\u0131n\u0131n dijital kimli\u011finin anahtar\u0131d\u0131r. Bu anahtarlar\u0131n k\u00f6t\u00fc niyetli ki\u015filerin eline ge\u00e7mesi, sadece ilgili uygulama i\u00e7in de\u011fil, ayn\u0131 zamanda kullan\u0131c\u0131lar\u0131n ayn\u0131 parolay\u0131 farkl\u0131 platformlarda kullanma e\u011filimi nedeniyle di\u011fer hizmetler i\u00e7in de b\u00fcy\u00fck bir tehdit olu\u015fturur. Ne yaz\u0131k ki, parola y\u00f6netimi konusunda hala yayg\u0131n olarak yap\u0131lan baz\u0131 hatalar bulunmaktad\u0131r:<\/p>\n<p>*   <strong>Parolalar\u0131 D\u00fcz Metin Olarak Saklamak:<\/strong> Bu, parola g\u00fcvenli\u011fi konusunda yap\u0131labilecek en b\u00fcy\u00fck hatad\u0131r. Veritaban\u0131 ihlali durumunda, t\u00fcm kullan\u0131c\u0131 parolalar\u0131 an\u0131nda a\u00e7\u0131\u011fa \u00e7\u0131kar.<br \/>\n*   <strong>Zay\u0131f \u015eifreleme Algoritmalar\u0131 Kullanmak (MD5, SHA-1, SHA-256):<\/strong> Bu algoritmalar, verilerin b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamak i\u00e7in tasarlanm\u0131\u015ft\u0131r, parola g\u00fcvenli\u011fi i\u00e7in de\u011fil. H\u0131zl\u0131 olmalar\u0131, g\u00f6kku\u015fa\u011f\u0131 tablolar\u0131 (rainbow tables) ve kaba kuvvet sald\u0131r\u0131lar\u0131na kar\u015f\u0131 savunmas\u0131z kalmalar\u0131na neden olur.<br \/>\n*   <strong>Sabit &#8220;Salt&#8221; Kullanmak veya Hi\u00e7 Kullanmamak:<\/strong> Salt, parolalar\u0131 kar\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131lan rastgele bir de\u011ferdir. Ayn\u0131 parolaya sahip iki kullan\u0131c\u0131n\u0131n hash de\u011ferlerinin farkl\u0131 olmas\u0131n\u0131 sa\u011flar. Salt kullan\u0131lmazsa, ayn\u0131 parolaya sahip kullan\u0131c\u0131lar\u0131n hash de\u011ferleri ayn\u0131 olur ve bu da sald\u0131rganlar\u0131n i\u015fini kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Yeterince Y\u00fcksek Maliyet Fakt\u00f6r\u00fc Kullanmamak:<\/strong> G\u00fc\u00e7l\u00fc parola hash algoritmalar\u0131, kas\u0131tl\u0131 olarak yava\u015f \u00e7al\u0131\u015facak \u015fekilde tasarlanm\u0131\u015ft\u0131r. Bu yava\u015fl\u0131\u011f\u0131 ayarlayan &#8220;maliyet fakt\u00f6r\u00fc&#8221; veya &#8220;i\u015f y\u00fck\u00fc fakt\u00f6r\u00fc&#8221; yeterince y\u00fcksek de\u011filse, kaba kuvvet sald\u0131r\u0131lar\u0131 yine de makul bir s\u00fcrede ba\u015far\u0131l\u0131 olabilir.<\/p>\n<p>Bu hatalardan ka\u00e7\u0131nmak i\u00e7in, modern ve g\u00fcvenli bir parola hash algoritmas\u0131 kullanmak zorunludur. \u0130\u015fte bu noktada <code>bcrypt<\/code> devreye girer.<\/p>\n<h3>Neden MD5, SHA-1, SHA-256 Gibi Basit Hash Algoritmalar\u0131 Yetersizdir?<\/h3>\n<p>MD5, SHA-1, SHA-256 gibi algoritmalar genellikle &#8220;kriptografik hash fonksiyonlar\u0131&#8221; olarak adland\u0131r\u0131l\u0131r ve verilerin b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc do\u011frulamak, dijital imzalar olu\u015fturmak veya dosya do\u011frulama gibi ama\u00e7lar i\u00e7in m\u00fckemmeldirler. Ancak, parolalar\u0131 g\u00fcvenli bir \u015fekilde saklamak i\u00e7in tasarlanmam\u0131\u015flard\u0131r ve bu ama\u00e7la kullan\u0131ld\u0131klar\u0131nda ciddi g\u00fcvenlik a\u00e7\u0131klar\u0131 yarat\u0131rlar. Nedenlerini daha derinlemesine inceleyelim:<\/p>\n<p>*   <strong>H\u0131z:<\/strong> Bu algoritmalar, m\u00fcmk\u00fcn oldu\u011funca h\u0131zl\u0131 \u00e7al\u0131\u015facak \u015fekilde tasarlanm\u0131\u015ft\u0131r. Bu, b\u00fcy\u00fck miktarda veriyi h\u0131zl\u0131ca i\u015flemek i\u00e7in harikad\u0131r, ancak parolalar s\u00f6z konusu oldu\u011funda bir zay\u0131fl\u0131kt\u0131r. Bir sald\u0131rgan, saniyede milyonlarca hatta milyarlarca parola tahminini test edebilir. Bu durum, kaba kuvvet sald\u0131r\u0131lar\u0131n\u0131 (brute-force attacks) ve s\u00f6zl\u00fck sald\u0131r\u0131lar\u0131n\u0131 (dictionary attacks) olduk\u00e7a kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>G\u00f6kku\u015fa\u011f\u0131 Tablolar\u0131 (Rainbow Tables):<\/strong> Bu algoritmalar i\u00e7in \u00f6nceden hesaplanm\u0131\u015f hash de\u011ferleri i\u00e7eren devasa veritabanlar\u0131 (g\u00f6kku\u015fa\u011f\u0131 tablolar\u0131) mevcuttur. E\u011fer bir veritaban\u0131 ihlali ya\u015fan\u0131rsa ve parolalar bu zay\u0131f hash fonksiyonlar\u0131yla hashlenmi\u015fse, sald\u0131rganlar bu tablolar\u0131 kullanarak hashlenmi\u015f parolalar\u0131 orijinal hallerine d\u00f6n\u00fc\u015ft\u00fcrebilirler. Salt kullan\u0131lsa bile, e\u011fer salt sabit veya tahmin edilebilir ise bu tablolar k\u0131smen i\u015fe yarayabilir.<br \/>\n<em>   <strong>\u00c7arp\u0131\u015fma (Collision) Olas\u0131l\u0131\u011f\u0131:<\/strong> Kriptografik hash fonksiyonlar\u0131n\u0131n bir di\u011fer \u00f6zelli\u011fi, iki farkl\u0131 girdinin ayn\u0131 \u00e7\u0131kt\u0131y\u0131 (hash de\u011feri) \u00fcretme olas\u0131l\u0131\u011f\u0131n\u0131n \u00e7ok d\u00fc\u015f\u00fck olmas\u0131d\u0131r. Ancak, bu olas\u0131l\u0131k tamamen s\u0131f\u0131r de\u011fildir ve teorik olarak, ayn\u0131 hash de\u011ferini veren farkl\u0131 bir parolay\u0131 bulmak m\u00fcmk\u00fcn olabilir. Parola hash&#8217;leme i\u00e7in bu risk daha da artar \u00e7\u00fcnk\u00fc sald\u0131rganlar sadece orijinal parolay\u0131 de\u011fil, ayn\u0131 hash&#8217;i veren <\/em>herhangi bir* parolay\u0131 bulmaya \u00e7al\u0131\u015f\u0131rlar.<br \/>\n*   <strong>Tek Y\u00f6nl\u00fcl\u00fck Yan\u0131lg\u0131s\u0131:<\/strong> Bu algoritmalar &#8220;tek y\u00f6nl\u00fc&#8221; olarak kabul edilir, yani hash de\u011ferinden orijinal veriyi elde etmek matematiksel olarak zordur. Ancak yukar\u0131da belirtildi\u011fi gibi, bu zorluk, parola g\u00fcvenli\u011fi i\u00e7in yeterli de\u011fildir \u00e7\u00fcnk\u00fc sald\u0131rganlar do\u011frudan tersine m\u00fchendislik yapmak yerine, \u00f6nceden hesaplanm\u0131\u015f de\u011ferleri veya h\u0131zl\u0131 deneme yan\u0131lma y\u00f6ntemlerini kullanabilirler.<\/p>\n<p>\u00d6zetle, MD5 ve SHA ailesi, performans odakl\u0131 algoritmalar olup, g\u00fcvenlik ihtiya\u00e7lar\u0131 ba\u011flam\u0131nda &#8220;yava\u015fl\u0131k&#8221; gerektiren parola hash&#8217;leme i\u00e7in uygun de\u011fildir. Bu nedenle, parolalar i\u00e7in \u00f6zel olarak tasarlanm\u0131\u015f, yava\u015f ve adaptif algoritmalar kullanmak zorunludur.<\/p>\n<h3>Bcrypt Nedir?<\/h3>\n<p>Bcrypt, parolalar\u0131 hashlemek i\u00e7in \u00f6zel olarak tasarlanm\u0131\u015f bir anahtar t\u00fcretme fonksiyonudur (key derivation function &#8211; KDF) ve Blowfish \u015fifreleme algoritmas\u0131na dayan\u0131r. Orijinal olarak OpenBSD i\u00e7in 1999 y\u0131l\u0131nda tasarlanm\u0131\u015f olup, zamanla pop\u00fclerli\u011fini art\u0131rm\u0131\u015ft\u0131r. Bcrypt&#8217;i di\u011fer hash algoritmalar\u0131ndan ay\u0131ran temel \u00f6zellikler \u015funlard\u0131r:<\/p>\n<p>*   <strong>Adaptif Hash&#8217;leme (Adaptive Hashing) ve Maliyet Fakt\u00f6r\u00fc (Work Factor\/Cost Factor):<\/strong> Bcrypt&#8217;in en \u00f6nemli \u00f6zelliklerinden biri, kas\u0131tl\u0131 olarak yava\u015f \u00e7al\u0131\u015facak \u015fekilde tasarlanmas\u0131 ve bu yava\u015fl\u0131\u011f\u0131n ayarlanabilir olmas\u0131d\u0131r. Bu, &#8220;maliyet fakt\u00f6r\u00fc&#8221; veya &#8220;i\u015f y\u00fck\u00fc fakt\u00f6r\u00fc&#8221; ad\u0131 verilen bir parametre ile kontrol edilir. Maliyet fakt\u00f6r\u00fc artt\u0131k\u00e7a, hash&#8217;leme i\u015flemi katlanarak daha fazla i\u015flem g\u00fcc\u00fc ve zaman gerektirir. Bu adaptif do\u011fa, Bcrypt&#8217;in gelecekteki i\u015flem g\u00fcc\u00fc art\u0131\u015flar\u0131na kar\u015f\u0131 diren\u00e7li olmas\u0131n\u0131 sa\u011flar. Yani, bilgisayarlar h\u0131zland\u0131k\u00e7a, maliyet fakt\u00f6r\u00fcn\u00fc art\u0131rarak Bcrypt&#8217;in g\u00fcvenli\u011fini koruyabilirsiniz. Bu, bir sald\u0131rgan\u0131n kaba kuvvet sald\u0131r\u0131lar\u0131 i\u00e7in gereken s\u00fcreyi astronomik d\u00fczeyde art\u0131r\u0131r.<br \/>\n*   <strong>Salt Kullan\u0131m\u0131:<\/strong> Bcrypt, her parolay\u0131 hash&#8217;lerken rastgele ve benzersiz bir salt (tuz) de\u011feri olu\u015fturur ve kullan\u0131r. Bu salt, hash de\u011ferinin i\u00e7ine g\u00f6m\u00fcl\u00fcd\u00fcr. Bu sayede:<br \/>\n    *   Ayn\u0131 parolaya sahip iki farkl\u0131 kullan\u0131c\u0131n\u0131n hash de\u011feri farkl\u0131 olur. Bu, sald\u0131rganlar\u0131n g\u00f6kku\u015fa\u011f\u0131 tablolar\u0131 kullanmas\u0131n\u0131 veya ayn\u0131 hash de\u011ferine sahip parolalar\u0131 tek seferde k\u0131rmas\u0131n\u0131 engeller.<br \/>\n    *   Sald\u0131rganlar\u0131n \u00f6nceden hesaplanm\u0131\u015f hash tablolar\u0131n\u0131 kullanmas\u0131 imkans\u0131z hale gelir, \u00e7\u00fcnk\u00fc her hash i\u00e7in farkl\u0131 bir salt kullan\u0131l\u0131r.<br \/>\n*   <strong>Bellek Yo\u011funlu\u011fu (Memory Hardness):<\/strong> Bcrypt, sadece i\u015flem g\u00fcc\u00fc de\u011fil, ayn\u0131 zamanda bellek kullan\u0131m\u0131 a\u00e7\u0131s\u0131ndan da yo\u011fun olacak \u015fekilde tasarlanm\u0131\u015ft\u0131r. Bu, GPU&#8217;lar veya \u00f6zel donan\u0131mlar (ASIC&#8217;ler) kullan\u0131larak yap\u0131lan paralel sald\u0131r\u0131lar\u0131n maliyetini art\u0131r\u0131r, \u00e7\u00fcnk\u00fc bu t\u00fcr sald\u0131r\u0131lar genellikle bellek s\u0131n\u0131rlamalar\u0131yla kar\u015f\u0131la\u015f\u0131r.<\/p>\n<p>Bu \u00f6zellikler, Bcrypt&#8217;i parolalar\u0131 g\u00fcvenli bir \u015fekilde depolamak i\u00e7in mevcut en iyi se\u00e7eneklerden biri haline getirir.<\/p>\n<h3>Bcrypt.js&#8217;e Giri\u015f<\/h3>\n<p><code>bcrypt.js<\/code>, <code>bcrypt<\/code> algoritmas\u0131n\u0131n saf JavaScript ile yaz\u0131lm\u0131\u015f bir uygulamas\u0131d\u0131r. Orijinal <code>bcrypt<\/code> paketi, C++ eklentileri kullanarak performans art\u0131\u015f\u0131 sa\u011flarken, <code>bcrypt.js<\/code> tamamen JavaScript oldu\u011fu i\u00e7in derleme gerektirmez ve bu da baz\u0131 da\u011f\u0131t\u0131m senaryolar\u0131nda (\u00f6rne\u011fin, serverless ortamlar veya derleme sorunlar\u0131 ya\u015fanabilecek platformlar) avantaj sa\u011flayabilir. Node.js ortam\u0131nda her iki paket de yayg\u0131n olarak kullan\u0131l\u0131r ve benzer API&#8217;lere sahiptir. Bu makalede <code>bcrypt.js<\/code> \u00fczerinde duraca\u011f\u0131z.<\/p>\n<h4>Kurulum<\/h4>\n<p><code>bcrypt.js<\/code>&#8216;i projenize eklemek olduk\u00e7a basittir. Terminalinizde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">npm install bcryptjs<\/code><\/pre>\n<h3>Bcrypt.js ile Temel Kavramlar ve Kullan\u0131m<\/h3>\n<p><code>bcrypt.js<\/code> k\u00fct\u00fcphanesi, parolalar\u0131 hash&#8217;lemek ve kar\u015f\u0131la\u015ft\u0131rmak i\u00e7in basit ve g\u00fc\u00e7l\u00fc bir API sunar. Genellikle asenkron (async) y\u00f6ntemler kullan\u0131l\u0131r, \u00e7\u00fcnk\u00fc hash&#8217;leme i\u015flemi kas\u0131tl\u0131 olarak yava\u015f oldu\u011fundan, Node.js&#8217;in tek i\u015f par\u00e7ac\u0131kl\u0131 (single-threaded) yap\u0131s\u0131n\u0131 engellememek \u00f6nemlidir.<\/p>\n<h4>1. Parola Hash&#8217;leme (Hashing a Password)<\/h4>\n<p>Bir kullan\u0131c\u0131 kaydoldu\u011funda veya parolas\u0131n\u0131 de\u011fi\u015ftirdi\u011finde, d\u00fcz metin parolas\u0131n\u0131 g\u00fcvenli bir \u015fekilde hash&#8217;lemeniz ve bu hash&#8217;i veritaban\u0131n\u0131zda saklaman\u0131z gerekir.<\/p>\n<p><code>bcrypt.js<\/code> ile parola hash&#8217;leme iki ana ad\u0131mdan olu\u015fur: salt olu\u015fturma ve parolay\u0131 hash&#8217;leme. Genellikle bu iki ad\u0131m tek bir fonksiyon \u00e7a\u011fr\u0131s\u0131yla ger\u00e7ekle\u015ftirilir.<\/p>\n<p>&#8220;`javascript<br \/>\nconst bcrypt = require(&#8216;bcryptjs&#8217;);<\/p>\n<p>\/\/ Parolay\u0131 hash&#8217;leme fonksiyonu<br \/>\nasync function hashPassword(plainPassword) {<br \/>\n    try {<br \/>\n        \/\/ Maliyet fakt\u00f6r\u00fc (cost factor) belirleme.<br \/>\n        \/\/ 10, \u00e7o\u011fu uygulama i\u00e7in iyi bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r.<br \/>\n        \/\/ 2^10 = 1024 iterasyon anlam\u0131na gelir.<br \/>\n        const saltRounds = 10; <\/p>\n<p>        \/\/ bcrypt.hash() fonksiyonu, hem salt olu\u015fturur hem de parolay\u0131 hash&#8217;ler.<br \/>\n        \/\/ \u0130lk parametre d\u00fcz metin parola, ikinci parametre saltRounds veya do\u011frudan salt.<br \/>\n        const hashedPassword = await bcrypt.hash(plainPassword, saltRounds);<br \/>\n        return hashedPassword;<br \/>\n    } catch (error) {<br \/>\n        console.error(&#8216;Parola hash\\&#8217;leme hatas\u0131:&#8217;, error);<br \/>\n        throw new Error(&#8216;Parola hash\\&#8217;leme i\u015flemi ba\u015far\u0131s\u0131z oldu.&#8217;);<br \/>\n    }<br \/>\n}<\/p>\n<p>\/\/ \u00d6rnek kullan\u0131m:<br \/>\nconst myPassword = &#8216;gizliParola123!&#8217;;<br \/>\nhashPassword(myPassword)<br \/>\n    .then(hash => {<br \/>\n        console.log(&#8216;Hashlenmi\u015f Parola:&#8217;, hash);<br \/>\n        \/\/ Bu hash de\u011ferini veritaban\u0131n\u0131zda saklay\u0131n.<br \/>\n        \/\/ \u00d6rnek bir hash: $2a$10$Ew.Yy.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"JavaScript&#8217;te Bcrypt.js ile Parolalar\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme\nParola g\u00fcvenli\u011fi, modern web uygulamalar\u0131n\u0131n ve genel olarak dijital g\u00fcve","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[129],"tags":[],"class_list":{"0":"post-31611","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-javascript","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>JavaScript&#039;te Bcrypt.js ile Parolalar\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JavaScript&#039;te Bcrypt.js ile Parolalar\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme\" \/>\n<meta property=\"og:description\" content=\"JavaScript&#039;te Bcrypt.js ile Parolalar\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme Parola g\u00fcvenli\u011fi, modern web uygulamalar\u0131n\u0131n ve genel olarak dijital g\u00fcve\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-11T19:41:13+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"28 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"JavaScript&#8217;te Bcrypt.js ile Parolalar\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme\",\"datePublished\":\"2025-10-11T19:41:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/\"},\"wordCount\":5672,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Javascript\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/\",\"name\":\"JavaScript'te Bcrypt.js ile Parolalar\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-11T19:41:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript&#8217;te Bcrypt.js ile Parolalar\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"JavaScript'te Bcrypt.js ile Parolalar\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/","og_locale":"tr_TR","og_type":"article","og_title":"JavaScript'te Bcrypt.js ile Parolalar\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme","og_description":"JavaScript'te Bcrypt.js ile Parolalar\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme Parola g\u00fcvenli\u011fi, modern web uygulamalar\u0131n\u0131n ve genel olarak dijital g\u00fcve","og_url":"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-11T19:41:13+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"28 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"JavaScript&#8217;te Bcrypt.js ile Parolalar\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme","datePublished":"2025-10-11T19:41:13+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/"},"wordCount":5672,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Javascript"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/","url":"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/","name":"JavaScript'te Bcrypt.js ile Parolalar\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-11T19:41:13+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-bcrypt-js-ile-parolalari-guvenli-bir-sekilde-yonetme\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"JavaScript&#8217;te Bcrypt.js ile Parolalar\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31611"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31611\/revisions"}],"predecessor-version":[{"id":31612,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31611\/revisions\/31612"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}