Băm SHA256 dài bao lâu?


244

Tôi sẽ chạy SHA256bằng mật khẩu + muối, nhưng tôi không biết phải làm bao lâu VARCHARkhi thiết lập cơ sở dữ liệu MySQL. Một chiều dài tốt là gì?


9
Trước khi bất cứ ai đọ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 vui lòng đọc nó trước .
c00000fd

2
Trừ khi bạn đang sử dụng SHA-256 trên mật khẩu, điều mà bạn không nên làm, băm có độ dài 256 bit hoặc 64 ký tự thập lục phân hoặc 43 ký tự chữ và số hoặc 32 byte.
caw

Câu trả lời:


331

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

Vì sha256 trả về một đại diện thập lục phân, 4 bit là đủ để mã hóa từng ký tự (thay vì 8, như đối với ASCII), do đó 256 bit sẽ đại diện cho 64 ký tự hex, do đó bạn cần a varchar(64), hoặc thậm chí a char(64), vì độ dài luôn giống nhau , không thay đổi chút nào.

Và bản demo:

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

Sẽ cung cấp cho bạn:

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

tức là một chuỗi có 64 ký tự.


7
chúng ta có thể sử dụng char (64) làm khóa chính hay nhị phân (32) sẽ tốt hơn cho điều đó? (access_token)
Frankish

3
Nếu bạn nghĩ rằng bạn có thể muốn chặn người dùng trong tương lai, thì tôi khuyên bạn nên sử dụng varchar(65)để dẫn đầu !... chỉ cần nói.
Manatax

103
... Hoặc chỉ thêm một cột 'bị chặn'?
Stijn de Witt

5
Vì bạn muốn có một loại muối khác nhau cho mỗi mật khẩu, bạn phải lưu trữ mã này bên cạnh hàm băm. Đối với điều này, bạn có thể sử dụng một trường bổ sung hoặc trước / thêm nó vào hàm băm, vì vậy bạn sẽ cần nhiều hơn 64 ký tự
Patrick Cornelissen

4
bạn có thể sử dụng câu lệnh select này để kiểm tra nó : SELECT length(to_base64(unhex(sha2('say hello to my little friend',256)))), nó luôn là 44 cho dù độ dài của chuỗi gốc là bao nhiêu.
DrAhmedJava

72

Tùy chọn mã hóa cho 256 bit của SHA256:

  1. Base64: 6 bit mỗi char = CHAR(44)bao gồm ký tự đệm
  2. Hex: 4 bit mỗi char = CHAR(64)
  3. Nhị phân: 8 bit mỗi byte = BINARY(32)

30
Base64 là 3 byte trên 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

2
Vâng, =có thể được tước và thêm lại.
Rick James

28

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

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

Do đó BINary (32)!


8
+1 - Tôi thích tối ưu hóa ... cho bất kỳ ai khác xảy ra về điều 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.
Kevin Nelson

22

Tại sao bạn lại biến nó thành VARCHAR? Nó không khác nhau. 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 một trong các máy tính SHA-256 trực tuyến .


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

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

10
varchar cũng không phân bổ không gian trừ khi đượ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 vào không.
Xenland

6

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


Và sử dụng CHARACTER SET ascii.
Rick James
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.