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?

Tony Stark
sumber
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.

Pascal MARTIN
sumber
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)
RickNZ
sumber
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)!

marctrem
sumber
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 .

ceejayoz
sumber
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
6

Ini akan diperbaiki 64 karakter, jadi gunakan char(64)

Noushad
sumber
Dan gunakan CHARACTER SET ascii.
Rick James