Kata Sandi Hash php

Saya memiliki sistem masuk yang sangat mendasar, yang mengautentikasi pengguna melalui tabel pengguna di database mysql dengan php.

adakah yang bisa menjelaskan apa gunanya hashing kata sandi, bagaimana melakukannya dengan php, dan apa yang sebenarnya disimpan dalam database.

Terima kasih


person TechplexEngineer    schedule 24.08.2010    source sumber
comment
lihat stackoverflow.com/questions/3505346/php-md5-explained/   -  person Chris    schedule 25.08.2010
comment
kemungkinan duplikat Hash dan garam aman untuk kata sandi PHP   -  person rook    schedule 25.08.2010


Jawaban (4)


dapatkah seseorang menjelaskan apa gunanya hashing kata sandi itu,

Tujuan dari hashing kata sandi adalah untuk tujuan keamanan. Jika dimasukkan sebagai teks biasa, siapa pun yang masuk ke database Anda sekarang akan mengetahui semua kata sandi pengguna Anda. Masalah besar lainnya yang muncul dari hal ini adalah kemungkinan besar hal ini akan membahayakan pengguna di mana pun, tidak hanya di situs Anda, karena kebanyakan orang cenderung menggunakan kata sandi yang sama di mana pun.

bagaimana melakukannya dengan php, dan apa yang sebenarnya disimpan di database.

Untuk menggunakannya di PHP Anda cukup mengambil string, dalam contoh ini $password = 'password'; dan gunakan perintah sha1();. Ini akan mengembalikan sesuatu seperti d0be2dc421be4fcd0172e5afceea3970e2f3d940. Ini juga merupakan praktik yang baik untuk 'menggarami' kata sandi dengan skrip php Anda, sehingga skrip login skrip PHP diperlukan agar berhasil login. Contoh:

<?php
    $salt1 = '2348SDasdf!^*__';
    $salt2 = '_a35j@*#(lsdf_';
    $password = sha1($salt1.$_POST['password'].$salt2); // d0be2dc421be4fcd0172e5afceea3970e2f3d940
?>

Kemudian masukkan $password ke dalam database Anda. Saat masuk, Anda perlu memasukkan kata sandi yang diberikan melalui sha1 agar cocok dengan kata sandi di database. Anda memasukkannya ke dalam database sama seperti string lainnya, pastikan Anda memiliki panjang yang cukup untuk kolom yang Anda coba masukkan juga.

person Robert    schedule 24.08.2010
comment
Ini bukan jawaban yang bagus, karena garamnya harus acak. Jika pengasinannya konstan, serangan brute force dapat memecahkan kata sandi secara paralel (yaitu per kata kamus yang dihasilkan, Anda menghitung satu hash dan melihat apakah itu cocok dengan salah satu dari N pengguna). Namun jika Anda mengambil garam acak, hash perlu dihitung untuk setiap kata dan setiap pengguna, sehingga menambahkan faktor N pada kompleksitasnya. - person mvds; 26.08.2010
comment
Berbeda dengan mereka yang mengetahui rahasianya dengan mendapatkan database, kedua cara tersebut memiliki kekurangannya masing-masing. Jika acak, Anda harus menyimpan garam di suatu tempat, yang jika seseorang dapat mengaksesnya, akan mudah dilakukan dengan kekerasan. - person Robert; 26.08.2010

Katakanlah seseorang membobol sistem Anda (atau menemukan celah dalam kueri sql Anda) maka Anda tidak ingin mereka mengetahui semua kata sandi.

Jadi, Anda melakukan hash sebelum menyimpannya. Jadi Anda dapat memeriksa apakah kata sandinya oke, tetapi tidak menyimpulkan kata sandi dari hash.

Kecuali Anda menggunakan hash yang lemah. Jika Anda hanya ingin sha1($password) maka Anda akan menemukan memasukkan hash kata sandi yang sering digunakan ke Google memberikan kata sandi dalam waktu kurang dari 0,1 detik.* (tetapi jika tidak, Anda juga dapat menemukan tabel pelangi untuk semua jenis hash)

Jadi Anda ingin menambahkan "garam", artinya, Anda menghasilkan beberapa nilai sampah:

$salt = rand().rand().rand();

dan kemudian simpan

$hash = $salt."-".sha1($salt.$password);

saat memeriksa, Anda mengetahui garamnya dan Anda dapat memeriksa apakah kata sandinya benar, tetapi mengetahui hash dan garamnya membuat pemulihan kata sandi masih sulit. (kecuali Anda memiliki meja pelangi yang berisi garam, tentu saja)

* ini memerlukan penjelasan: Saya pernah mengambil tabel pengguna yang besar dan menemukan beberapa hash muncul beberapa kali. Saya mencari di Google yang paling sering terjadi dan terbalik menjadi computer

person mvds    schedule 24.08.2010
comment
MD5 harus dianggap rusak secara kriptografis dan tidak cocok untuk penggunaan lebih lanjut. kb.cert.org/vuls/id/836068 - person webbiedave; 25.08.2010
comment
rand() tidak aman secara kriptografis. juga garamnya harus menjadi kolom terpisah, itu desain db yang buruk. - person rook; 25.08.2010
comment
Jadi jika peretas mengetahui apa itu garam, bukankah itu sepenuhnya menghancurkan tujuan pengasinan? - person TechplexEngineer; 25.08.2010
comment
@The Rook: Bahkan jika saya setuju, itu sedikit tidak penting di sini. (dan sejujurnya, saya tidak setuju, karena saya ingin menyimpan kata sandi salt+hash sejumlah data atomik yang bagus ke mana pun saya membawanya. Salt dan hash tidak ada gunanya jika dipisahkan, saya hanya mengemas/membongkarnya saat diperlukan, seluruh sistem hanya melihatnya sebagai satu string) - person mvds; 25.08.2010
comment
@TechplexEngineer itu tidak merusak tujuan. Anda memberi garam pada kata sandi Anda untuk membuatnya lebih sulit. Anda mengunci pintu di rumah untuk mencegah pencurian kecil-kecilan, namun pencuri yang gigih tidak akan dapat digagalkan oleh sesuatu seperti pintu yang dikunci. - person Robert; 25.08.2010
comment
@Techplex: tidak, karena jika dia tahu garamnya, katakanlah, 7236817 maka dia secara efektif harus membalikkan hash 7236817your_password, yang kecil kemungkinannya terjadi di tabel pelangi. Selain itu, kekerasan pada semua akun pengguna Anda berarti penyerang harus melakukan hash pada setiap kata sandi yang dia coba untuk setiap garam yang ditemukan. Jadi, panjangkan saja garamnya dan masukkan lebih dari 0-9 ke dalamnya! - person mvds; 25.08.2010
comment
@mvds Saya rasa itu berarti garam Anda alfanumerik atau bahkan mungkin hanya base16. Garam harus base256 (byte penuh per karakter), Anda menginginkan rasio entropi terhadap panjang string paling banyak. - person rook; 25.08.2010
comment
@Rock baiklah, saya akan menyimpannya dengan alfanumerik (atau OP akan kembali lagi nanti dengan masalah data biner mysql), tapi bagaimanapun juga contoh dengan rand() adalah yang paling mudah untuk menyampaikan pesan. - person mvds; 25.08.2010

Hash adalah "fungsi satu arah". Anda memasukkan kata sandi dan mendapatkan keluaran yang kira-kira unik yang tidak dapat (secara komputasi layak) diubah kembali menjadi kata sandi asli. Tergantung pada hashnya, ini akan terlihat berbeda. Misalnya, dengan sha1 (http://php.net/manual/en/function.sha1.php) Anda akan selalu mendapatkan string sepanjang 20 byte.

Keuntungannya adalah kata sandi asli tidak pernah disimpan dalam teks biasa. Untuk memverifikasi kata sandi pengguna, Anda cukup menghitung hash pada kata sandi yang seharusnya dan membandingkannya dengan hash yang disimpan. Jika seseorang mendapatkan basis data kata sandi Anda, mereka masih belum memiliki kata sandi sebenarnya.

person Jonathan    schedule 24.08.2010
comment
Nah, Anda dapat dengan mudah menemukan daftar besar kata sandi umum. Sangat mudah untuk menulis sebuah program untuk menghitung hash pada semuanya, dan kemudian membandingkan hash tersebut dengan database kata sandi. Tentu saja, ini hanya relevan ketika seseorang memiliki akses ke kata sandi yang di-hash. Selain itu, hal ini dapat dicegah secara efektif dengan menggunakan garam seperti yang disebutkan di postingan lain. - person Jonathan; 25.08.2010
comment
ya, jika saya memberi tahu Anda bahwa saya meng-hash kata sandi saya menggunakan md5($password), dan hash saya adalah 08b5411f848a2581a41672a759c87380, dapatkah Anda memberi tahu saya apa kata sandi saya? - person mvds; 25.08.2010
comment
@Jonathan: Anda tidak perlu melakukan hal-hal ini sendiri lagi, semuanya sudah tersedia dan diindeks secara gratis. - person mvds; 25.08.2010
comment
Omong-omong, hash itu mengembalikan beberapa hasil yang tidak terduga: tabel pengguna! - person mvds; 25.08.2010
comment
Benar, tetapi Anda tidak memerlukan md5decryption.com untuk itu, Google akan baik-baik saja. - person mvds; 25.08.2010

Belum ada yang menjelaskan alasannya, jadi izinkan saya: sebagian besar pengguna bodoh dan menggunakan kata sandi yang sama di mana saja. Anda tidak ingin seorang peretas membobol sistem Anda, ambil kata sandinya lalu pergi dan retas akun pengguna Anda di tempat lain.

person James    schedule 24.08.2010
comment
Ini jadi bukan itu intinya. Intinya adalah jika database Anda dicuri, Anda harus memberi tahu 1 juta pengguna Anda bahwa sandi mereka dicuri dan mereka harus mengubahnya. Mereka tidak akan melakukannya, jadi akan ada orang gila yang memiliki akses ke akun 900 ribu pengguna di sistem Anda. Jadi kamu mempunyai masalah terbesar. - person mvds; 25.08.2010
comment
agak bagus @mvds, kecuali Anda dapat memaksa pengguna Anda mengubah kata sandi untuk mengatasi masalah itu - itu tidak akan membuat Anda populer tetapi akan berhasil. Tapi poin saya masih bagus. Tentu saja, jika seorang peretas meretas situs orang lain menggunakan kata sandi yang dicuri dari Anda, itu bukan masalah Anda - namun apakah menurut Anda (mungkin mantan) pelanggan Anda akan melihatnya seperti itu? - person James; 25.08.2010
comment
Tentu saja itu tergantung. Jika Anda adalah sebuah perusahaan, Anda dapat memaksa 100% karyawan Anda untuk mengubah kata sandi, dan mereka tidak akan meninggalkan perusahaan Anda karena hal itu, benar. Jika Anda gmail/hotmail, Anda dapat memaksa mungkin 80% (dengan asumsi banyak akun mati), dan beberapa pelanggan akan meninggalkan Anda. Jika Anda berada di bidang hal-hal yang kurang penting (jejaring sosial, game, forum, ...) kemungkinan besar Anda akan menakuti 50% pengguna Anda dengan susah payah, karena Anda harus memblokir akun di beberapa titik, jika pengguna tidak menanggapi permintaan Anda. Selain itu ada masalah bahwa untuk kasus terakhir, Anda -- lanjutan - person mvds; 26.08.2010
comment
-- mungkin tidak memiliki mekanisme yang tepat untuk benar-benar mengautentikasi pengguna (pertanyaan rahasia, tanggal lahir sebenarnya, ...). Jadi risiko sebenarnya adalah Anda akan gulung tikar, bukan hanya karena pemberitaan yang buruk. - person mvds; 26.08.2010