แฮช SHA256 นานแค่ไหน


247

ฉันจะใช้SHA256รหัสผ่าน + เกลือ แต่ฉันไม่รู้ว่าจะต้องใช้เวลานานแค่ไหนVARCHARเมื่อตั้งค่าฐานข้อมูล MySQL ความยาวที่ดีคืออะไร?


9
ก่อนที่ทุกคนที่อ่านข้อความนี้ตัดสินใจที่จะทำตามคำแนะนำนี้และการใช้SHA-*รหัสผ่านกัญชาโปรดอ่านนี้เป็นครั้งแรก
c00000fd

2
หากคุณไม่ใช้ SHA-256 กับรหัสผ่านซึ่งคุณไม่ควรทำแฮชจะมีความยาว 256 บิตหรือ 64 ตัวอักษรฐานสิบหกหรือตัวอักษรและตัวเลข 43 ตัวหรือ 32 ไบต์
caw

คำตอบ:


335

sha256 ยาว 256 บิต - ตามชื่อบ่งชี้

เนื่องจาก sha256 ส่งคืนการแทนเลขฐานสิบหก 4 บิตก็เพียงพอที่จะเข้ารหัสอักขระแต่ละตัว (แทน 8 เช่น ASCII) ดังนั้น 256 บิตจะแทน 64 ตัวอักษรฐานสิบหกดังนั้นคุณจึงต้อง a varchar(64)หรือแม้กระทั่ง a char(64)เนื่องจากความยาวจะเท่ากันเสมอ ไม่แตกต่างกันเลย

และตัวอย่าง:

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

จะให้คุณ:

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

เช่นสตริงที่มี 64 ตัวอักษร


7
เราสามารถใช้ char (64) เป็นคีย์หลักหรือจะเป็นเลขฐานสอง (32) จะดีกว่าได้ไหม? (ACCESS_TOKEN)
ส่ง

3
หากคุณคิดว่าคุณอาจต้องการปิดกั้นผู้ใช้ในอนาคตฉันแนะนำให้ใช้varchar(65)สำหรับผู้นำ!... เพียงแค่พูด
Manatax

103
... หรือเพียงแค่เพิ่มคอลัมน์ 'ถูกบล็อก'?
Stijn de Witt

5
ตามที่คุณต้องการให้มีเกลือแตกต่างกันสำหรับแต่ละรหัสผ่านคุณต้องเก็บสิ่งนี้ไว้ถัดจากแฮช สำหรับสิ่งนี้คุณสามารถใช้เขตข้อมูลพิเศษหรือเพิ่ม / ต่อท้ายแฮชดังนั้นคุณจะต้องใช้มากกว่า 64 ตัวอักษร
Patrick Cornelissen

4
คุณสามารถใช้คำสั่ง select นี้เพื่อทดสอบ: SELECT length(to_base64(unhex(sha2('say hello to my little friend',256))))มันคือ 44 เสมอไม่ว่าความยาวของสายอักขระเดิมคืออะไร
DrAhmedJava

72

ตัวเลือกการเข้ารหัสสำหรับ 256 บิตของ SHA256:

  1. Base64: 6 บิตต่ออักขระถ่าน = CHAR(44)รวมถึงอักขระตัวเสริม
  2. Hex: 4 บิตต่อถ่าน = CHAR(64)
  3. ไบนารี: 8 บิตต่อไบต์ = BINARY(32)

30
Base64 คือ 3 ไบต์ต่อ 4 ตัวอักษรดังนั้นแม้ว่า 32 ไบต์จะพอดีกับ 43 ตัวอักษร แต่คุณต้องการ 44 จริง ๆ = เพิ่มพิเศษ = เป็นอักขระตัวสุดท้าย
Wilco

2
ดี=สามารถปล้นและเพิ่มใหม่
Rick James

28

ฉันชอบที่จะใช้ BINARY (32) เพราะมันเป็นวิธีที่ดีที่สุด!

คุณสามารถใส่ตัวเลขฐานสิบหก 32 ตัวจาก (00 ถึง FF)

ดังนั้นไบนารี (32)!


8
1 - ผมชอบที่ดีที่สุด ... เพื่อคนอื่น ๆ ที่เกิดขึ้นในนี้ ... ที่จะใช้กับ MySQL ... UPDATE...SET hash_column=UNHEX(sha256HexString)คุณสามารถใช้ SELECT HEX(hash_column) AS hash_columnจากนั้นเมื่อดึงมันคุณ
Kevin Nelson

22

ทำไมคุณถึงทำให้ VARCHAR ไม่แตกต่างกัน มีความยาว 64 ตัวอักษรซึ่งสามารถกำหนดได้โดยใช้อะไรก็ตามในเครื่องคิดเลข SHA-256ออนไลน์


char (64) คำสั่ง mysql ที่ถูกต้องคืออะไร?
Tony Stark

28
@hatorade: ไม่ใช่มันไม่ใช่คำสั่ง แต่เป็นประเภทคอลัมน์ที่ถูกต้อง
Mark Byers

10
varchar ยังไม่ได้จัดสรรพื้นที่เว้นเสียแต่ว่าจะมีการใช้งานซึ่งแตกต่างจากถ่านมันจัดสรรจำนวนของจำนวนตัวอักษรทั้งหมดที่ได้รับอนุญาตโดยไม่คำนึงว่ามีข้อมูลกรอก
Xenland

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.