Hashing adalah fungsi sehala yang memetakan data-panjang data untuk output panjang tetap, tetapi algoritma hashing mudah seperti MD5 dan SHA-1 terdedah kepada serangan akibat kelemahan yang diketahui dan kemungkinan perlanggaran.
- Kata laluan salting menambah nilai yang unik untuk setiap kata laluan sebelum hashing, meningkatkan keselamatan dengan menghalang serangan seperti meja pelangi dan kekerasan, tetapi garam mesti disimpan dengan selamat untuk mencegah eksploitasi.
- Peregangan kata laluan meningkatkan keselamatan dengan mengasingkan kata laluan beberapa kali, yang menangguhkan percubaan pada retak, membuat serangan kekerasan lebih banyak memakan masa dan kurang layak.
- Menggunakan algoritma hashing yang kuat dan moden seperti SHA-256 atau BCRYPT, dan melaksanakan teknik seperti salting dan regangan, penting untuk meningkatkan keselamatan kata laluan. Walaupun peningkatan dalam teknik hashing, tiada kaedah yang tidak jelas kerana potensi untuk kemajuan dalam kuasa dan teknik pengiraan, menggariskan keperluan untuk kemas kini dan penilaian strategi penyimpanan kata laluan yang berterusan.
- Dalam artikel yang lalu, Hashing Kata Laluan dibincangkan sebagai cara untuk menyimpan kelayakan pengguna dengan selamat dalam aplikasi. Keselamatan sentiasa menjadi topik yang sangat kontroversial, politik dan agama yang sama, di mana banyak pandangan wujud dan 'penyelesaian sempurna' untuk seseorang tidak sama dengan orang lain. Pada pendapat saya, melanggar langkah -langkah keselamatan aplikasi hanyalah masalah masa. Dengan kuasa komputer dan kerumitan meningkat setiap hari, aplikasi selamat hari ini tidak akan selamat esok.
- Bagi pembaca kami yang tidak biasa dengan apa algoritma hash, ia tidak lebih daripada satu cara berfungsi yang memetakan data panjang berubah kepada data panjang tetap. Oleh itu, jika kita menganalisis definisi di atas, kita perlu memahami keperluan dan ciri -ciri berikut algoritma tersebut:
Peta data panjang berubah -ubah ke data panjang tetap: Bermakna bahawa ruang mesej input boleh "tak terhingga", tetapi ruang output tidak. Ini mempunyai implikasi bahawa 2 atau lebih mesej input boleh mempunyai hash yang sama. Semakin kecil ruang output, semakin besar kebarangkalian 'perlanggaran' antara dua mesej input.
- MD5 telah mengesahkan perlanggaran praktikal dan kebarangkalian SHA1 untuk mencapai perlanggaran berkembang setiap hari (lebih lanjut mengenai kebarangkalian perlanggaran dapat dijumpai dengan menganalisis masalah ulang tahun klasik), jadi jika kita perlu menggunakan algoritma hashing, kita harus menggunakan yang mempunyai ruang output yang lebih besar (dan kebarangkalian perlanggaran yang tidak dapat dielakkan), seperti SHA256, SHA512, Whirlpool, dan lain -lain ...
- Mereka juga dipanggil 'fungsi pseudo-rawak', yang bermaksud bahawa output fungsi hashing harus tidak dapat dibezakan dari penjana nombor rawak yang benar (atau trng).
-
mengapa hashing mudah tidak selamat untuk menyimpan kata laluan
Hakikat bahawa output fungsi hash tidak boleh kembali ke input menggunakan algoritma yang cekap tidak bermakna ia tidak boleh retak. Pangkalan data yang mengandungi hash kata -kata biasa dan rentetan pendek biasanya dalam jangkauan kami dengan carian Google yang mudah. Juga, rentetan biasa boleh dengan mudah dan cepat-cepat dipaksa atau retak dengan serangan kamus.
Demonstrasi
Berikut adalah video cepat tentang bagaimana alat seperti SQLMAP boleh memecahkan kata laluan melalui suntikan SQL dengan hash bruteforcing MD5 dalam pangkalan data.
Juga, kita hanya boleh melakukan serangan yang paling mudah ... hanya ambil hash dan Google itu ... kemungkinan bahawa hash wujud dalam pangkalan data dalam talian. Contoh pangkalan data hash adalah:
- http://www.hash-database.net/
- https://isc.sans.edu/tools/hashsearch.html
- http://md5online.net/
- https://crackstation.net/
kita juga perlu mempertimbangkan bahawa sejak 2 atau lebih kata laluan yang sama akan mempunyai nilai hash yang sama, memecahkan satu hash secara automatik akan memberi anda kata laluan setiap pengguna yang menggunakannya sama. Hanya untuk menjadi jelas, katakan anda mempunyai beribu -ribu pengguna, kemungkinan besar jumlahnya akan digunakan (jika dasar kata laluan tidak dikuatkuasakan) kata laluan '123456' yang terkenal. Nilai hash MD5 kata laluan itu ialah 'E10ADC3949BA59ABBE56E057F20F883E', jadi apabila anda memecahkan hash ini (jika anda perlu) dan mencari semua pengguna yang mempunyai nilai ini dalam medan kata laluan mereka, anda akan tahu bahawa setiap satu daripada mereka menggunakannya Kata laluan '123456'.
mengapa hash asin tidak selamat untuk menyimpan kata laluan
Untuk mengurangkan serangan ini, garam menjadi biasa tetapi jelas tidak mencukupi untuk kuasa pengkomputeran hari ini, terutama jika tali garam pendek, yang menjadikannya kasar.
fungsi kata laluan/garam asas ditakrifkan sebagai:<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
Oleh kerana setiap pengguna akan mempunyai garam yang sama sekali berbeza, ini juga mengelakkan masalah dengan hash mudah, di mana kita dapat dengan mudah memberitahu jika 2 atau lebih pengguna menggunakan kata laluan yang sama; Sekarang hash akan berbeza. Kami juga tidak lagi boleh mengambil kata laluan hash secara langsung dan cuba google. Juga, dengan garam yang panjang, serangan kekerasan adalah mustahil. Tetapi, jika penyerang mendapat akses kepada garam ini sama ada dengan serangan suntikan SQL atau akses langsung ke pangkalan data, serangan kekerasan atau serangan kamus menjadi mungkin, terutamanya jika pengguna anda menggunakan kata laluan biasa (sekali lagi, seperti '123456'):<span>Generate some string or get entry from dictionary </span><span>Concatenate with salt </span><span>Apply hash algorithm </span><span>If generated hash == hash in database then Bingo </span><span>else continue iterating</span>
Tetapi walaupun satu kata laluan mendapat retak, itu tidak akan memberi anda kata laluan secara automatik untuk setiap pengguna yang mungkin menggunakannya, kerana tiada pengguna harus mempunyai hash yang disimpan yang sama.isu rawak
Untuk menghasilkan garam yang baik, kita harus mempunyai penjana nombor rawak yang baik. Jika Rand PHP () berfungsi secara automatik muncul dalam fikiran anda, lupakannya dengan segera.
Terdapat artikel yang sangat baik mengenai Randomness in Random.org. Ringkasnya, komputer tidak boleh berfikir data rawak dengan sendirinya. Komputer dikatakan sebagai mesin deterministik, yang bermaksud bahawa setiap algoritma tunggal komputer dapat dijalankan, memandangkan input yang sama, akan selalu menghasilkan output yang sama.
Apabila nombor rawak diminta ke komputer, ia biasanya mendapat input dari beberapa sumber, seperti pembolehubah persekitaran (tarikh, masa, # bait bacaan/ditulis, uptime ...), kemudian gunakan beberapa pengiraan pada mereka untuk menghasilkan data rawak . Inilah sebab mengapa data rawak yang diberikan oleh algoritma dipanggil rawak pseudo dan oleh itu penting untuk membezakan dari sumber data rawak yang benar. Sekiranya kita entah bagaimana dapat mencipta semula keadaan yang tepat pada masa pelaksanaan penjana nombor pseudo-rawak (atau PRNG), kita secara automatik akan mempunyai nombor yang dihasilkan asal.
Selain itu, jika PRNG tidak dilaksanakan dengan betul, adalah mungkin untuk menemui corak dalam data yang dihasilkan. Jika corak wujud, kita boleh meramalkan hasilnya ... mengambil contohnya fungsi Rand () PHP pada Windows seperti yang didokumenkan di sini. Walaupun tidak jelas versi PHP atau Windows yang digunakan, anda boleh memberitahu ada sesuatu yang salah dengan melihat bitmap yang dihasilkan dengan menggunakan rand ():
Walaupun isu ini telah ditangani pada php> = 5, rand () dan juga mt_rand () masih dianggap sangat tidak mencukupi untuk tujuan berkaitan keselamatan.
Jika anda perlu menjana data rawak, sila gunakan openssl_random_pseudo_bytes () yang tersedia seperti Php 5> = 5.3.0, ia juga mempunyai bendera crypto_strong yang akan memberitahu anda jika bait itu cukup selamat.
Berikut adalah sampel kod cepat untuk menghasilkan rentetan rawak menggunakan openssl_random_pseudo_bytes ()
<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
Untuk terus mengurangkan serangan kekerasan, kita dapat melaksanakan teknik peregangan kata laluan. Ini hanyalah algoritma berulang atau rekursif yang mengira nilai hash berulang kali, biasanya puluhan ribu kali (atau lebih).
Algoritma ini harus berulang cukup untuk melakukan semua pengiraan dalam sekurang -kurangnya 1 saat (hashing yang lebih perlahan juga bermakna penyerang perlu menunggu).
Untuk memecahkan kata laluan yang dijamin dengan peregangan, penyerang harus:- Ketahui kiraan lelaran yang tepat, sebarang sisihan akan menghasilkan hash yang sama sekali berbeza.
- harus menunggu sekurang -kurangnya 1 saat antara setiap percubaan.
Ini membuat serangan tidak mungkin ... tetapi tidak mustahil. Untuk mengatasi kelewatan 1 saat, penyerang harus mempunyai spesifikasi perkakasan yang lebih tinggi daripada komputer yang mana algoritma itu ditala, sesuatu yang mungkin bermakna kos yang tinggi, jadi serangan itu menjadi mahal.
anda juga boleh menggunakan algoritma standard, seperti pbkdf2 yang merupakan fungsi derivasi utama berasaskan kata laluan<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
Terdapat juga algoritma intensif masa dan memori seperti bcrypt (melalui fungsi crypt ()) dan scrypt<span>Generate some string or get entry from dictionary </span><span>Concatenate with salt </span><span>Apply hash algorithm </span><span>If generated hash == hash in database then Bingo </span><span>else continue iterating</span>
di mana kos $ adalah faktor kerja, dan $ garam adalah rentetan rawak yang anda boleh menghasilkan menggunakan fungsi Secure_rand () di atas.enkripsi ) adalah istilah yang sering dikelirukan. Seperti yang saya nyatakan sebelum ini, hashing adalah fungsi pseudo-rawak, manakala cyphering umumnya adalah 'permutasi pseudo-rawak' . Ini bermakna mesej input dihiris dan diubah sedemikian rupa sehingga output tidak dapat dibezakan dari trng, namun output dapat diubah kembali ke input asal. Transformasi ini dilakukan dengan menggunakan kunci penyulitan, tanpa itu mustahil untuk mengubah output ke dalam mesej asal sekali lagi. ciphering mempunyai perbezaan besar lain berbanding hashing. Walaupun ruang mesej output hashing adalah terhingga, ruang mesej output ciphering tidak terhingga, kerana hubungan antara input dan output adalah 1: 1, oleh itu perlanggaran tidak boleh wujud.
seseorang harus berhati -hati dengan cara menggunakan teknik penyulitan dengan betul, memikirkan bahawa hanya dengan menggunakan algoritma penyulitan kepada data sensitif cukup untuk memastikan ia selamat dianggap salah, kerana banyak masalah yang boleh menyebabkan kebocoran data. Sebagai peraturan umum, anda tidak boleh mempertimbangkan untuk menggunakan pelaksanaan penyulitan anda sendiri
Baru -baru ini, Adobe mempunyai kebocoran data besar -besaran pangkalan data pengguna mereka, kerana mereka salah menggunakan teknik penyulitan dan saya akan mengambilnya sebagai contoh apa yang tidak perlu dilakukan. Saya akan cuba untuk menjadi lurus ke hadapan yang mungkin, menjaga perkara yang sangat mudah.
Pertimbangkan skema berikut:
katakan kandungan teks biasa jadual adalah seperti berikut:
Sekarang, seseorang di Adobe memutuskan untuk memujuk kata laluan, tetapi membuat dua kesilapan besar:
- menggunakan kekunci cipher yang sama untuk menyulitkan kata laluan
- memutuskan untuk meninggalkan medan petunjuk kata laluan dalam teks biasa
katakan contohnya, selepas menggunakan algoritma penyebaran ke medan kata laluan, kini data kami kelihatan seperti berikut:
"Saya satu!" Yang tidak memberi kita banyak maklumat, namun rekod 3 rekod ... kita dapat dengan selamat meneka bahawa kata laluan adalah "ratu". Rekod 2 dan 7 petunjuk tidak memberi banyak maklumat sahaja, tetapi jika kita melihatnya bersama, berapa banyak cuti yang mempunyai nama yang sama seperti filem menakutkan? Sekarang kita mempunyai akses kepada akaun semua orang yang menggunakan "Halloween" sebagai kata laluan.
Untuk mengurangkan risiko kebocoran data, lebih baik untuk beralih kepada teknik hashing, namun jika anda mesti menggunakan teknik penyulitan untuk menyimpan kata laluan, kami boleh menggunakan penyulitan tweakable. Istilah ini kelihatan mewah, tetapi sangat mudah.'tweak' yang akan menjadi unik kepada setiap pengguna, dan kedua -dua kunci dan tweak bersama -sama akan menjadi kunci penyulitan untuk setiap rekod. Yang paling mudah tweak yang tersedia adalah kunci utama, yang secara definisi adalah unik untuk setiap rekod dalam jadual (walaupun saya tidak mengesyorkan untuk menggunakannya, ini hanya untuk menunjukkan konsep):
f (kunci, primaryKey) = Key PrimaryKeydan harus ) menggunakan algoritma hashing atau fungsi derivasi utama kepada mereka. Juga, bukannya menggunakan kunci utama sebagai tweak, anda mungkin ingin menjana nonce (serupa dengan garam) untuk setiap rekod untuk digunakan sebagai tweak.
Setelah menggunakan penyulitan tweakable ke jadual pengguna, kini kelihatan seperti berikut:Sudah tentu kita masih mempunyai masalah petunjuk kata laluan, tetapi sekarang setiap rekod mempunyai nilai yang unik, jadi tidak jelas yang pengguna menggunakan kata laluan yang sama.
Saya ingin menekankan bahawa penyulitan bukan penyelesaian terbaik, dan harus dielakkan jika mungkin untuk menyimpan kata laluan kerana banyak kelemahan dapat disuntik ... Anda boleh dan harus berpegang pada penyelesaian yang terbukti (seperti bcrypt) untuk menyimpan kata laluan, tetapi Perlu diingat bahawa walaupun penyelesaian yang terbukti mempunyai kelemahan mereka.
Kesimpulan
Tidak ada penyelesaian yang sempurna dan risiko seseorang melanggar langkah -langkah keselamatan kita tumbuh setiap hari. Walau bagaimanapun, kajian kriptografi dan keselamatan data dan penyelidikan berterusan, dengan definisi baru -baru ini mengenai fungsi span, toolkit kami terus berkembang setiap hari.
Soalan Lazim (Soalan Lazim) pada Hashing Kata Laluan
Apakah perbezaan antara hashing dan penyulitan kata laluan?
Hashing dan penyulitan kata laluan adalah dua kaedah yang berbeza yang digunakan untuk menjamin data, tetapi mereka berfungsi dengan tujuan yang berbeza. Penyulitan adalah fungsi dua hala; Apa yang disulitkan boleh disahsulit dengan kunci yang betul. Ini bermakna jika seseorang mendapat akses kepada kunci penyulitan, mereka boleh menyahsulit data. Sebaliknya, hashing adalah fungsi sehala yang menggosok teks biasa untuk menghasilkan mesej yang unik. Malah perubahan kecil dalam input akan menghasilkan perubahan drastik dalam output yang nilai hash baru tidak akan menyerupai yang lama. Ini menjadikannya mustahil untuk menjana semula data asal dari nilai hash, menjadikan hashing lebih selamat untuk menyimpan kata laluan. digunakan sebagai input tambahan kepada fungsi sehala yang mempunyai data, kata laluan atau frasa laluan. Garam digunakan untuk melindungi kata laluan dalam simpanan. Fungsi utama garam adalah untuk mempertahankan serangan kamus atau terhadap serangan meja pelangi yang telah dipasang. Dengan menambah garam yang unik, hash menjadi unik kepada setiap pengguna, walaupun dua pengguna mempunyai kata laluan yang sama. Ini bermakna walaupun penggodam mempunyai akses kepada nilai hash, mereka tidak dapat memecahkan kata laluan tanpa garam yang unik.
Apakah risiko menggunakan algoritma hash yang lemah? Seperti MD5 dan SHA-1, terdedah kepada serangan. Mereka telah mengetahui kelemahan dan boleh retak dengan mudah dengan kuasa pengkomputeran moden. Sebagai contoh, mereka terdedah kepada serangan perlanggaran, di mana dua input yang berbeza menghasilkan output hash yang sama. Ini menjejaskan integriti data. Oleh itu, disarankan untuk menggunakan algoritma hashing yang lebih kuat seperti SHA-256 atau BCRYPT yang memberikan tahap keselamatan yang lebih tinggi. keselamatan kata laluan yang disimpan. Ini dilakukan dengan menggunakan fungsi hash kriptografi kepada kata laluan pengguna, bersama-sama dengan garam, dan kemudian membasmi semula hasilnya berkali-kali. Proses ini meningkatkan masa yang diperlukan untuk kata laluan hash, yang dapat menghalang penyerang yang bergantung pada membuat banyak percubaan cepat untuk meneka kata laluan.
Apakah serangan meja pelangi? Jadual pelangi mengandungi semua permutasi plaintext yang mungkin kata laluan yang disulitkan. Kaedah ini berkesan terhadap hashing asas, tetapi menambah garam yang unik untuk setiap kata laluan hash dapat menghalang serangan meja pelangi.
Mengapa penting untuk menjaga rahsia algoritma hashing? Pastikan rahsia algoritma hashing, tidak semestinya mungkin, terutamanya dengan algoritma yang digunakan secara meluas. Keselamatan sistem hashing yang baik tidak bergantung pada kerahsiaan algoritma; Sebaliknya, ia bergantung kepada kerahsiaan dan kekangan garam yang ditambah kepada hash. Walaupun penyerang mengetahui algoritma, tanpa garam, mereka tidak boleh membalikkan kata laluan dari hash. sebagai garam rahsia yang kedua, ditambah untuk meningkatkan keselamatan kata laluan yang disimpan. Walaupun garam biasanya disimpan dalam pangkalan data bersebelahan kata laluan hashed, lada disimpan rahsia dan disimpan secara berasingan, selalunya dalam kod aplikasi. Ini bermakna bahawa walaupun penyerang memperoleh akses ke pangkalan data, tanpa lada, mereka tidak dapat memecahkan kata laluan. atau mengubah algoritma hashing bergantung kepada beberapa faktor, termasuk kepekaan data yang anda lindungi dan keadaan teknologi semasa. Sebagai peraturan, jika algoritma hashing yang lebih selamat diterima secara meluas, atau jika kelemahan didapati dalam algoritma semasa, sudah tiba masanya untuk dikemas kini. Sentiasa terus maklumat mengenai perkembangan terkini dalam kriptografi untuk memastikan keselamatan maksimum.
Apakah kesan fungsi hash ke atas prestasi aplikasi saya? intensif dan boleh memberi kesan kepada prestasi permohonan anda. Walau bagaimanapun, kesan ini biasanya boleh diabaikan berbanding dengan faedah keselamatan. Kelewatan yang disebabkan oleh fungsi hash yang selamat sebenarnya boleh menjadi penghalang kepada penyerang, kerana ia melambatkan percubaan untuk meneka kata laluan. Untuk memastikan keselamatan kata laluan pengguna maksimum, ikuti amalan terbaik ini: Gunakan algoritma hashing yang kuat, selamat, dan terkini; Tambahkan garam yang unik untuk setiap hash kata laluan; Pertimbangkan untuk menambah lada; dan melaksanakan regangan kata laluan. Di samping itu, menguatkuasakan dasar kata laluan yang kuat untuk pengguna anda, seperti panjang minimum, dan campuran aksara, nombor, dan simbol.
Atas ialah kandungan terperinci Risiko dan cabaran hashing kata laluan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Beban mengimbangi mempengaruhi pengurusan sesi, tetapi dapat diselesaikan dengan replikasi sesi, ketegangan sesi, dan penyimpanan sesi berpusat. 1. Sesi Replikasi Salinan Data Sesi Antara Pelayan. 2. Sesi Stickiness mengarahkan permintaan pengguna ke pelayan yang sama. 3. Penyimpanan Sesi Pusat menggunakan pelayan bebas seperti Redis untuk menyimpan data sesi untuk memastikan perkongsian data.

Sessionlockingisatechniqueusedtoensureauserererersessionremainsexclusivetooneuseratatime.IScrucialFreventingDataCorruptionSandsecuritybreachesinmulti-userapplications.SessionLockingISimplementedusingserverververveChan

Alternatif untuk sesi PHP termasuk kuki, pengesahan berasaskan token, sesi berasaskan pangkalan data, dan redis/memcached. 1.Cookies Menguruskan sesi dengan menyimpan data pada klien, yang mudah tetapi rendah dalam keselamatan. 2. Pengesahan berasaskan token menggunakan token untuk mengesahkan pengguna, yang sangat selamat tetapi memerlukan logik tambahan. 3.Database-berasaskan data menyimpan data dalam pangkalan data, yang mempunyai skalabilitas yang baik tetapi boleh menjejaskan prestasi. 4. Redis/Memcached menggunakan cache yang diedarkan untuk meningkatkan prestasi dan skalabiliti, tetapi memerlukan pemadanan tambahan

SessionHijacking merujuk kepada penyerang yang menyamar sebagai pengguna dengan mendapatkan sessionId pengguna. Kaedah pencegahan termasuk: 1) menyulitkan komunikasi menggunakan HTTPS; 2) mengesahkan sumber sessionId; 3) menggunakan algoritma generasi sesi yang selamat; 4) Secara kerap mengemas kini sessionId.

Artikel ini membincangkan PHP, memperincikan bentuk penuhnya, kegunaan utama dalam pembangunan web, perbandingan dengan Python dan Java, dan kemudahan pembelajarannya untuk pemula.

PHP mengendalikan data borang menggunakan $ \ _ post dan $ \ _ mendapatkan superglobals, dengan keselamatan memastikan melalui pengesahan, sanitisasi, dan interaksi pangkalan data yang selamat.

Artikel ini membandingkan PHP dan ASP.NET, memberi tumpuan kepada kesesuaian mereka untuk aplikasi web berskala besar, perbezaan prestasi, dan ciri keselamatan. Kedua-duanya berdaya maju untuk projek besar, tetapi PHP adalah sumber terbuka dan bebas platform, sementara ASP.NET,

Kepekaan kes PHP berbeza -beza: Fungsi tidak sensitif, manakala pembolehubah dan kelas sensitif. Amalan terbaik termasuk penamaan yang konsisten dan menggunakan fungsi kes-insensitif untuk perbandingan.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

SublimeText3 Linux versi baharu
SublimeText3 Linux versi terkini

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

MantisBT
Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Dreamweaver CS6
Alat pembangunan web visual
