Berapa lama hash SHA256?


247

Saya akan SHA256menggunakan kata sandi + garam, tapi saya tidak tahu berapa lama waktu saya VARCHARmengatur database MySQL. Berapa panjang yang bagus?


9
Sebelum ada yang membaca ini memutuskan untuk mengikuti saran ini dan menggunakan SHA-*kata sandi hash, HARAP baca ini dulu .
c00000fd

2
Kecuali jika Anda menggunakan SHA-256 pada kata sandi, yang seharusnya tidak Anda lakukan, hash memiliki panjang 256 bit, atau 64 karakter heksadesimal, atau 43 karakter alfanumerik, atau 32 byte.
gak

Jawaban:


336

Panjang sha256 adalah 256 bit - seperti namanya.

Karena sha256 mengembalikan representasi heksadesimal, 4 bit cukup untuk menyandikan setiap karakter (bukan 8, seperti untuk ASCII), jadi 256 bit akan mewakili 64 karakter hex, oleh karena itu Anda memerlukan varchar(64), atau bahkan a char(64), karena panjangnya selalu sama , tidak berbeda sama sekali.

Dan demo:

$hash = hash('sha256', 'hello, world!');
var_dump($hash);

Akan memberimu :

$ php temp.php
string(64) "68e656b251e67e8358bef8483ab0d51c6619f3e7a1a9f0e75838d41ff368f728"

yaitu string dengan 64 karakter.


7
dapatkah kita menggunakan char (64) sebagai kunci utama atau akankah biner (32) lebih baik untuk itu? (access_token)
frankish

3
Jika Anda berpikir Anda mungkin ingin memblokir pengguna di masa depan, maka saya sarankan menggunakan varchar(65)untuk memimpin !... hanya mengatakan.
Manatax

105
... atau cukup tambahkan kolom 'diblokir'?
Stijn de Witt

5
Karena Anda ingin memiliki garam berbeda untuk setiap kata sandi, Anda harus menyimpan ini di sebelah hash. Untuk ini, Anda dapat menggunakan bidang tambahan atau pra- / menambahkannya ke hash, sehingga Anda akan membutuhkan lebih dari 64 karakter
Patrick Cornelissen

4
Anda dapat menggunakan pernyataan pilih ini untuk mengujinya:, SELECT length(to_base64(unhex(sha2('say hello to my little friend',256))))selalu ada berapa pun panjang string asli.
DrAhmedJava

72

Opsi enkode untuk 256 bit SHA256:

  1. Base64: 6 bit per char = CHAR(44) termasuk karakter padding
  2. Hex: 4 bit per char = CHAR(64)
  3. Biner: 8 bit per byte = BINARY(32)

30
Base64 adalah 3 byte per 4 karakter, jadi meskipun 32 byte cocok dengan 43 karakter, Anda sebenarnya membutuhkan 44. Ekstra = ditambahkan sebagai karakter akhir
Wilco

2
Nah, =bisa dilucuti dan ditambahkan kembali.
Rick James

28

Saya lebih suka menggunakan BINARY (32) karena ini adalah cara yang dioptimalkan!

Anda dapat menempatkan 32 angka hex tersebut dari (00 hingga FF).

Karenanya BINARY (32)!


8
+1 - Saya suka dioptimalkan ... untuk siapa saja yang melakukan hal ini ... untuk menggunakan ini dengan MySQL ... yang dapat Anda gunakan UPDATE...SET hash_column=UNHEX(sha256HexString). Lalu, saat mengambilnya, Anda SELECT HEX(hash_column) AS hash_column.
Kevin Nelson

22

Mengapa Anda membuatnya VARCHAR? Itu tidak bervariasi. Itu selalu 64 karakter, yang dapat ditentukan dengan memasukkan apa pun ke dalam salah satu kalkulator SHA-256 online .


apakah char (64) pernyataan mysql yang valid?
Tony Stark

28
@hatorade: Tidak, ini bukan pernyataan, tapi ini adalah tipe kolom yang valid.
Mark Byers

10
varchar juga tidak mengalokasikan ruang kecuali yang digunakan, tidak seperti char, ia mengalokasikan jumlah total karakter yang diizinkan terlepas dari apakah ada data yang mengisinya.
Xenland

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.