เหตุใดจึงมีความไม่สอดคล้องกันในเอาต์พุต base64


12

ฉันใช้ฐานข้อมูลกราฟ neo4j บน lubuntu 15.04

ส่วนหัวการรับรองความถูกต้อง HTTP neo4j ใช้การเข้ารหัส base64 ของ 'ชื่อผู้ใช้: รหัสผ่าน' (ไม่รวมเครื่องหมายคำพูด) ใช้ wireshark ฉันสามารถดูรหัส base64 ที่สร้างโดย neo4j

อย่างไรก็ตามถ้าฉันใช้ coreutils ubuntu core64 เพื่อเข้ารหัสสตริงเดียวกันฉันจะได้รับการเข้ารหัสที่แตกต่างกันเล็กน้อย การเข้ารหัสนี้ไม่เป็นที่ยอมรับโดย neo4j

การเข้ารหัสทั้งสองถอดรหัสเป็นชื่อผู้ใช้ที่ถูกต้อง: สตริงรหัสผ่าน

ตัวอย่าง

ชื่อผู้ใช้ = neo4jและรหัสผ่าน =@N

Neo4j ให้ค่าการเข้ารหัสneo4j:@NตามbmVvNGo6QE4=ที่ถอดรหัสneo4j:@Nเป็นอย่างที่คาดไว้

$ echo 'bmVvNGo6QE4=' | base64 --decode
neo4j:@N

coreutils ของ Ubuntu base64ส่งกลับค่าที่เข้ารหัสneo4j:@Nเป็นbmVvNGo6QE4K(ซึ่งแตกต่างจากอักขระตัวสุดท้าย) แต่ก็ยังถอดรหัสได้อย่างถูกต้อง

$ echo 'neo4j:@N' | base64
bmVvNGo6QE4K
$ echo 'bmVvNGo6QE4K' | base64 --decode
neo4j:@N

ทำไมนี้ ฉันต้องทำอะไรเพื่อให้ได้การเข้ารหัสที่สอดคล้องกัน


3
โปรดทราบว่า=ใน Base64 ปกติคือการเติม (และใช้ได้เฉพาะตอนท้าย) ความจริงที่ว่าหนึ่งสายเข้ารหัสมี padding และอื่น ๆ ไม่ได้ (หรือโดยทั่วไปว่าทั้งสองสายมีจำนวนที่แตกต่างกันของ padding) เป็นของแถมที่ตายแล้วที่ทั้งสองมีความยาวแตกต่างกันและจึงอาจไม่เหมือนกัน
CVn

คำตอบ:


56

คุณกำลังเข้ารหัสสตริงที่แตกต่างกัน (เล็กน้อย):

$ echo 'bmVvNGo6QE4=' | base64 --decode | od -c
0000000   n   e   o   4   j   :   @   N
0000010
$ echo 'neo4j:@N' | od -c
0000000   n   e   o   4   j   :   @   N  \n
0000011

echoเพิ่มอักขระขึ้นบรรทัดใหม่ที่ต่อท้าย สิ่งนี้นำไปสู่การเข้ารหัสที่แตกต่างกัน

ใช้printfแทนซึ่งมีข้อกำหนดคุณลักษณะเอาต์พุตแน่นอนมากขึ้น:

$ printf '%s' 'neo4j:@N' | base64              
bmVvNGo6QE4=

10
คำตอบที่ดี upvoted ทราบว่า$ echo -n "neo4j:@N" | base64ยังใช้งานได้
Doug Smythies

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