เหตุใดสตริงที่แฮชและการเข้ารหัสจำนวนมากจึงลงท้ายด้วยเครื่องหมายเท่ากับ


64

ฉันทำงานใน C # และ MSSQL และตามที่คุณคาดหวังว่าฉันเก็บรหัสผ่านของฉันเค็มและแฮช

เมื่อฉันดูแฮชที่เก็บไว้ในคอลัมน์ nvarchar (ตัวอย่างเช่นผู้ให้บริการสมาชิก aspnet out box) ฉันสงสัยอยู่เสมอว่าทำไมค่าของเกลือและแฮชที่สร้างขึ้นดูเหมือนจะจบลงด้วยสัญญาณหนึ่งหรือสองเท่ากับ

ฉันเคยเห็นสิ่งที่คล้ายกันขณะทำงานกับอัลกอริธึมการเข้ารหัสนี่เป็นเหตุบังเอิญหรือมีเหตุผลหรือไม่


19
นอกจากนี้หากคุณกำลังจัดเก็บข้อมูลไบนารีที่เข้ารหัส Base64 ไว้ในเขตข้อมูล NVARCHAR ฉันร้องไห้เพราะเสียที่เก็บข้อมูลขนาด 6x ของคุณ! สำหรับหนึ่ง Base64 สามารถมีอักขระได้ 64 ตัวในครึ่งล่างของ ASCII (ดังนั้นคุณต้องการเพียง VARCHAR เพื่อบันทึกครึ่งหนึ่ง) สำหรับสอง Base64 จะกระจายข้อมูลแต่ละไบต์เป็นอักขระ 1-4 ตัว SQL Server มีประเภท VARBINARY ที่สามารถเก็บแฮชของคุณได้โดยไม่ต้องเข้ารหัสและไม่สนใจการเปรียบเทียบในการเปรียบเทียบ ... :-)
jimbobmcgee

3
@ WillieWheeler แฮชจะต้องถูกเก็บไว้อย่างใด Base64 อาจไม่ใช่สื่อจัดเก็บข้อมูลที่สมบูรณ์แบบ แต่ไม่มีอะไรผิดปกติกับมัน หากhash("my password")สร้างอาร์เรย์[1,2,3,4,5]และฉันต้องการเก็บค่าเหล่านั้นในฐานข้อมูลมีตัวเลือกที่แย่กว่าการจัดเก็บสตริงAQIDBAU=(แน่นอนถ้าฟังก์ชันแฮชที่ใช้อยู่สร้างสตริงแล้วดูเหมือนว่าโง่ไปแล้ว Base64 เข้ารหัสมัน )
Brian S

2
@ WillieWheeler ฉันคิดว่าคุณไม่มีจุด อ่านสิ่งที่ Brian S เขียนอีกครั้ง - เขาไม่ได้พูดถึงคุณสมบัติของ base64 สำหรับการแปลงแป้นพิมพ์ - นั่นอาจเป็นเรื่องไร้สาระที่ base64 ไม่ใช่ขั้นตอนวิธีการแปลงแป้นพิมพ์ เขาบอกว่าไม่มีอะไรผิดปกติกับการจัดเก็บแฮช (ที่ผลิตโดยฟังก์ชันแฮช / อัลกอริทึม) ในรูปแบบฐาน 64
Andrew Savinykh

3
OP บอกว่าเขาเก็บแฮชและมันจบลงด้วยเครื่องหมายเท่ากับ นั่นแสดงว่าเขาสับสนกับการเข้ารหัส Base64 ถ้าประเด็นคือว่ามันดีสำหรับ base64 แล้วเข้ารหัสแฮชแน่นอน แต่สิ่งนั้นเกี่ยวข้องกับอะไร?
Willie Wheeler

2
ใช่ในที่สุดฉันก็รู้ว่าเกิดอะไรขึ้น ฉันดูไฟล์กุญแจสาธารณะและส่วนตัวของ SSH และสังเกตว่าพวกเขายังมีตอนจบ = / == นี่คือการเข้ารหัส base64 ของอาร์เรย์ไบต์เช่น BrianS และ zespri อธิบาย ขอบคุณเพื่อน.
Willie Wheeler

คำตอบ:


95

สตริงที่แฮชเหล่านี้ (ปกติแล้ว) เข้ารหัสในรูปแบบ Base64 และใช้เครื่องหมายเท่ากับสำหรับการขยายสตริงเพื่อทำให้ความยาว (จำนวนไบต์) หารด้วยสาม วิกิพีเดียอธิบายว่ามันสวยดี: http://en.wikipedia.org/wiki/Base64


36

เป็นไปได้หรือไม่ที่เป็นฐานการเข้ารหัส 64

ลำดับ '==' ระบุว่ากลุ่มสุดท้ายมีเพียงหนึ่งไบต์และ '=' ระบุว่ามีสองไบต์ ตัวอย่างด้านล่างแสดงให้เห็นว่าการตัดทอนข้อมูลนำเข้าทั้งหมดของเครื่องหมายคำพูดด้านบนเปลี่ยนการเพิ่มช่องว่างออกได้อย่างไร:

http://en.wikipedia.org/wiki/Base64#Output_padding

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