2010-02-10 43 views
169

Tôi sẽ chạy SHA256 trên mật khẩu + muối, nhưng tôi không biết phải làm bao lâu để tạo VARCHAR khi thiết lập cơ sở dữ liệu MySQL. Chiều dài tốt là gì?Hàm băm SHA256 dài bao lâu?

+3

Trước khi mọi người đọc điều này quyết định làm theo lời khuyên này và sử dụng 'SHA- * 'để băm mật khẩu, [XIN đọc điều này trước] (https: //security.stackexchan ge.com/questions/16354/whats-the-advantage-of-using-pbkdf2-vs-sha256-to-generate-an-aes-encryption-key). – c00000fd

+0

Một blog chi tiết có ví dụ: http: //sforsuresh.in/mysql_varchar_max_length/ –

Trả lời

241

Một sha256 dài 256 bit - như tên gọi của nó.

Nếu bạn đang sử dụng một biểu diễn thập lục phân, mỗi chữ số mã cho 4 bit; vì vậy bạn cần 64 chữ số để đại diện cho 256 bit - vì vậy, bạn cần một số varchar(64) hoặc char(64), vì độ dài luôn giống nhau, không thay đổi chút nào.

Và demo:

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

sẽ cung cấp cho bạn:

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

ví dụ: một chuỗi với 64 ký tự.

+6

chúng ta có thể sử dụng char (64) làm khóa chính hay nhị phân (32) tốt hơn không? (access_token) – frankish

+3

Nếu bạn nghĩ rằng bạn có thể muốn chặn một người dùng trong tương lai, sau đó tôi đề nghị sử dụng 'varchar (65)' cho một '!' hàng đầu ... chỉ cần nói. – Manatax

+54

... hoặc chỉ cần thêm cột 'bị chặn'? –

19

Tại sao bạn làm cho VARCHAR? Nó không thay đổi. Nó luôn luôn có 64 ký tự, có thể được xác định bằng cách chạy bất cứ thứ gì vào one of the online SHA-256 calculators.

+0

là char (64) một câu lệnh mysql hợp lệ? – sepiroth

+21

@hatorade: Không, đó không phải là tuyên bố, nhưng đó là một loại cột hợp lệ. –

+9

varchar cũng không phân bổ không gian trừ khi nó được sử dụng, không giống như char nó phân bổ số lượng tổng số ký tự được phép bất kể có dữ liệu điền không. – Xenland

6

Nó sẽ được cố định 64 ký tự, vì vậy sử dụng char(64)

18

Tôi thích sử dụng Binary (32) vì nó là cách tối ưu hóa!

Bạn có thể đặt trong đó 32 chữ số thập phân từ (00 đến FF).

Vì vậy, BINARY (32)!

+6

+1 - Tôi thích tối ưu hóa ... cho bất kỳ ai khác đang diễn ra trên này ... để sử dụng điều này với MySQL ... bạn có thể sử dụng 'UPDATE ... SET hash_column = UNHEX (sha256HexString)'.Sau đó, khi lấy nó, bạn 'SELECT HEX (hash_column) AS hash_column'. –

32

tùy chọn Encoding cho 256 bit SHA256 của:

  1. Base64: 6 bit mỗi char = CHAR(44) bao gồm nhân vật đệm
  2. Hex: 4 bit mỗi char = CHAR(64)
  3. Binary: 8 bit cho mỗi byte = BINARY(32)
+13

Base64 là 3 byte cho 4 ký tự, vì vậy mặc dù 32 byte phù hợp với 43 ký tự, bạn thực sự cần 44. Thêm = được thêm làm ký tự cuối cùng – Wilco