การเข้ารหัสไม่สามารถย้อนกลับได้?


9

ฉันอยู่ภายใต้การแสดงผลที่ไม่สามารถถอดรหัสสตริงที่เข้ารหัสดังนั้นค่าดั้งเดิมจะสูญหายไปตลอดกาล

อย่างไรก็ตามหากสตริงต่อไปนี้เท่ากับ "Dominic" (ชื่อของฉัน) จะไม่มีวิธีตรรกะในการย้อนกลับ การเป็นแบบไม่สุ่มไม่ขึ้นอยู่กับวันที่ / เวลา แต่มีวิธีการแบบตรรกะหรือไม่?

0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=

ไม่ว่าฉันจะเข้ารหัส "Dominic" (สตริง) กี่ครั้งหรือกี่ครั้งก็ตามมันก็เท่ากับเสมอ ดังนั้นไม่ควรมีวิธีถอดรหัสสตริงเช่นนั้นหรือ

ตัวอย่างของสิ่งที่ฉันพูดถึง:

public string EncryptPassword(string password)
{
    return Convert.ToBase64String(
        System.Security.Cryptography.SHA256.Create()
        .ComputeHash(Encoding.UTF8.GetBytes(password)));
}

3
คุณกำลังพูดถึงแฮชการเข้ารหัสของชื่อ (มักใช้ในรหัสผ่าน) หรือไม่? หรือการเข้ารหัส (ซึ่งมีวัตถุประสงค์เพื่อถอดรหัสโดยผู้มีอำนาจ)

11
SHA256เป็นฟังก์ชันแฮชการเข้ารหัสลับไม่ใช่อัลกอริทึมการเข้ารหัส มันเป็นฟังก์ชั่นทางเดียว

1
ข้อจำกัดความรับผิดชอบ: salt the hash ( en.wikipedia.org/wiki/Salt_(cryptography) ) ยิ่งไปกว่านั้น SHA256 มีแนวโน้มที่จะเร็วเกินไปที่จะไม่มีปัญหากับการโจมตีแบบโหดเหี้ยมเช่น GPUs ขอแนะนำให้ใช้บางอย่างเช่น PBKDF2 หรือ scrypt
Maciej Piechotka

7
การบีบแตรเหมือนเครื่องบดเนื้อ คุณสามารถเปลี่ยนวัวให้เป็นเนื้อดินได้ แต่ไม่ใช่วิธีอื่น ๆ
Neil McGuigan

1
คุณสับสนกับการเข้ารหัสลับสาธารณะ / คีย์ส่วนตัวหรือไม่ หากบุคคลอื่นเข้ารหัสข้อความด้วยกุญแจสาธารณะของคุณเขาจะไม่สามารถถอดรหัสข้อความนั้นได้ด้วยตนเอง มีเพียงคุณเท่านั้นที่สามารถถอดรหัสสิ่งนี้ - และอาจเป็น NSA, Mossad, FSB และ Tiroler Geheimdienst
ott--

คำตอบ:


39

การเข้ารหัสสามารถย้อนกลับได้ตลอดเวลา จุดเข้ารหัสคือการส่งข้อความและเข้ารหัสด้วยรหัสลับเพื่อให้เฉพาะบุคคลที่มีกุญแจเท่านั้นที่สามารถย้อนกลับการเข้ารหัสและอ่านข้อความได้

สิ่งที่คุณกำลังดูที่นี่คือการแฮ็กซึ่งไม่เหมือนกับการเข้ารหัสแม้ว่าเทคนิคการเข้ารหัสมักใช้ในการใช้แฮช แนวคิดของแฮชคือการใช้เทคนิคทางคณิตศาสตร์ที่ซับซ้อนเพื่อสร้างค่าใหม่ที่แมปกับค่าเก่าซึ่งสามารถทำซ้ำได้ ไม่มีกุญแจและไม่ได้หมายความว่าจะต้องย้อนกลับ กัญชาที่แข็งแกร่งเข้ารหัสถูกสร้างขึ้นด้วยคุณสมบัติทางคณิตศาสตร์ที่ถ้าคุณมีค่าAที่มีกัญชาคุ้มค่าBก็มากยากมากที่จะจงใจสร้างมูลค่าอื่นCที่ยัง hashes Bไป

แฮชไม่จำเป็นต้องย้อนกลับได้เพราะใช้สำหรับการตรวจสอบสิทธิ์ ถ้าคุณให้ชื่อผู้ใช้และรหัสผ่านแก่ฉันคุณไม่ต้องการให้ฉันเก็บรหัสผ่านนั้นไว้ในฐานข้อมูลของฉันเพราะถ้ามีใครบางคนแฮ็กและเข้าถึงฐานข้อมูลของฉันพวกเขาจะได้รับรหัสผ่านของคุณ! ดังนั้นฉันจะเก็บแฮชของรหัสผ่านของคุณในฐานข้อมูลแทน จากนั้นเมื่อคุณเข้าสู่ระบบฉันจะตรวจสอบเพื่อดูว่ามีชื่อผู้ใช้ที่ตรงกับคุณด้วยรายการรหัสผ่านที่ตรงกับแฮชของรหัสผ่านที่คุณส่งและถ้าเป็นเช่นนั้นคุณจะได้รับการรับรองความถูกต้อง สองค่าที่แฮชเป็นค่าเดียวกัน) ด้วยแฮชที่ดีดังนั้นฉันเกือบแน่ใจได้อย่างสมบูรณ์ว่ารหัสผ่านที่คุณใช้นั้นเป็นค่าที่ถูกต้อง

คุณสมบัติอื่นของแฮชการเข้ารหัสที่แข็งแกร่งคือมันยากที่จะย้อนกลับ คุณรู้ว่าคุณค่า0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=คือความยุ่งเหยิงของ "โดมินิก" เพราะคุณเพิ่งทำมันออกมา แต่ถ้าคุณไม่รู้เรื่องนั้นและไม่รู้ว่าจะเริ่มมองหาที่ไหนและทุกสิ่งที่คุณมีอยู่0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=มันอาจทำให้คุณพันล้าน ปีที่จะคิดออกว่าต้นฉบับคือ "โดมินิก" ถ้าแฮชเป็นสิ่งที่ดี นี่เป็นประโยชน์ในการป้องกันความเสียหายของหลักประกันในกรณีที่รายการรหัสผ่านถูกขโมย


2
ฉันไม่สามารถใช้รายการคำศัพท์ที่รู้จักและวนซ้ำจนกว่าฉันจะพบแฮชตรงกันหรือไม่ นี่คือสาเหตุที่เว็บไซต์แนะนำให้เพิ่มตัวอักษรตัวใหญ่และตัวเลขในรหัสผ่านของคุณเพื่อให้ปลอดภัยยิ่งขึ้นหรือไม่
user1477388

15
@ user1477388: ใช่ที่ว่าทำไมเว็บไซต์แนะนำว่า นั่นเป็นวิธีที่รู้จักกันดีในการโจมตีรหัสผ่านที่ถูกแฮช: มันถูกเรียกว่า "การโจมตีด้วยพจนานุกรม" ด้วยเหตุผลที่ชัดเจนและการใช้คำที่ไม่ได้อยู่ในพจนานุกรมเป็นขั้นตอนสำคัญสำหรับการป้องกันพวกเขา ..
Mason Wheeler

1
ดูเหมือนว่าจะมีความเข้าใจที่ดีเกี่ยวกับ "การไม่สามารถเชื่อว่าสิ่งเหล่านี้ไม่สามารถย้อนกลับได้" security.stackexchange.com/questions/11717/ …ไม่ว่าฉันต้องการ / มีความต้องการที่จะย้อนกลับ ฉันแค่อยากรู้
user1477388

3
ข้อเสนอแนะอีกประการหนึ่งคือการเพิ่มสิ่งที่ไม่ซ้ำกันในแต่ละรหัสผ่านก่อนที่จะถูกแฮช ความแตกต่างของรหัสผ่านตัวละครตัวหนึ่งทำให้แฮชแตกต่างอย่างสิ้นเชิงแนวคิดที่ว่าผลลัพธ์แฮชทั้งหมดของคุณจะไม่ซ้ำกัน มิฉะนั้นหากแฮ็กเกอร์ค้นพบแฮชสำหรับคำว่า "password123" พวกเขาจะรู้ว่าใช้กับชื่อผู้ใช้ทั้งหมดด้วยแฮชนั้น ดูเหมือนว่าคุณจะมีความคิดที่ดีสำหรับเรื่องแบบนี้โชคดีมาก
Katana314

1
@MasonWheeler: การใช้คำที่ไม่ได้อยู่ในพจนานุกรมนั้นไม่จำเป็นจริงๆโดยเฉพาะอย่างยิ่งการพิจารณาว่า "พจนานุกรม" ที่ใช้ในการโจมตีทั่วไปนั้นไม่เหมือนพจนานุกรมออกซ์ฟอร์ด แต่เป็นรายการของสตริงที่ใช้ในรหัสผ่านบ่อย . แทนที่จะพยายามหลีกเลี่ยงคำเหล่านี้จะเป็นการดีกว่าที่จะเลือกพูดคำสุ่ม 5 คำจากรายการคำศัพท์ประมาณ 2,000 คำเช่นวลีรหัสผ่านแม้ว่าจะรู้จักพจนานุกรมคำศัพท์ 2000 คำใช้เวลานานเกือบ 100 ครั้งในการลบ - บังคับให้มีอักขระสุ่ม 8 ตัวจาก 64 ตัว
tdammers

9

สิ่งที่คุณกำลังทำอยู่ไม่ใช่ "การเข้ารหัส" ตามลำดับ มันคือ "hashing" แตกต่างที่สำคัญระหว่างทั้งสองก็คือว่าการเข้ารหัสเป็นแบบพลิกกลับได้อย่างง่ายดาย (กับคีย์ที่ถูกต้องแน่นอน) ในขณะที่คร่ำเครียดถูกออกแบบมาให้เป็นเรื่องยากมากที่จะย้อนกลับในกรณีอื่น ๆ กว่ารู้ข้อความต้นฉบับในสถานที่แรก ๆ

ในทางทฤษฎีแฮชจำลองเป็น "Random oracle" ซึ่งเป็น homunculus สมมุติฐานที่มีหน่วยความจำแบบ eidetic และวิธีการสร้างเอกลักษณ์ที่ไม่ซ้ำใครอย่างสมบูรณ์แบบโดยไม่ จำกัด ช่วงบน คุณจะให้ข้อความเล็ก ๆ แก่ชายคนนี้และหนึ่งในสองสิ่งจะเกิดขึ้น ไม่ว่าเขาจะไม่เคยเห็นข้อความมาก่อนซึ่งในกรณีนี้เขาสร้างหมายเลขสุ่มใหม่และมอบสิ่งนั้นให้กับคุณในฐานะผู้สรุปหรือเขาเคยเห็นความยุ่งเหยิงนั้นมาก่อนดังนั้นเขาจึงจำและให้หมายเลขที่เขาสร้างขึ้นเมื่อเขาเห็น ครั้งแรก. ในแบบจำลองเชิงทฤษฎีนั้นไม่มีความสัมพันธ์ระหว่างข้อความกับข้อมูลย่อยและไม่มีหมายเลขเดียวที่เคยปรากฏสองครั้งจาก RNG ไม่มีความเป็นไปได้สำหรับการชน

น่าเสียดายที่เราไม่มีออราเคิลแบบสุ่มในอุดมคติ แนวคิดมีความเป็นไปไม่ได้ในทางปฏิบัติสำหรับการนำไปใช้ในระบบดิจิทัลเช่นความสามารถของ oracle ในการจัดเก็บและเรียกคืนข้อความทุกข้อความที่ทุกคนเคยแฮ็กอย่างมีประสิทธิภาพและมีประสิทธิภาพความสามารถของลูกค้าในการยอมรับตัวเลขที่อาจ ความยาว แต่เรามีฟังก์ชันแฮชซึ่งเป็นการดำเนินการทางคณิตศาสตร์แบบย้อนกลับ (ทางเดียว) ที่ทำงานกับข้อความนั้นเพื่อสร้างการเปลี่ยนแปลงที่กำหนดขึ้น (ข้อความเดียวกัน => แฮชเดียวกัน) โดยไม่มีความชัดเจนความสัมพันธ์ระหว่างแฮชและข้อความต้นฉบับ ดังที่ได้กล่าวไว้ในความคิดเห็นไม่ควรมีการเปลี่ยนแปลงที่คาดเดาได้สำหรับค่าแฮชที่เกิดจากการเปลี่ยนแปลงข้อความอย่างเป็นระบบ โดยปกติแล้วการแยกย่อยแต่ละบิตจะมีโอกาส 50% ในการเปลี่ยนแปลงเนื่องจากการเปลี่ยนแปลงข้อความเพียงเล็กน้อย

มีประโยชน์หลายอย่างสำหรับฟังก์ชั่นแฮช พวกเขาจะใช้สำหรับการตรวจสอบความท้าทาย (คิดว่าข้อมูลประจำตัวในการเข้าสู่ระบบเช่นรหัสผ่าน) โดยไม่จำเป็นต้องให้ทั้งสองฝ่ายรู้ถึงความลับของข้อความล้วนและพวกเขาจะใช้เป็น checksums เพื่อตรวจสอบว่าข้อความนั้น พวกเขายังใช้ในสถานการณ์ที่เรียกว่า "หลักฐานการทำงาน" งานการคำนวณที่ยากต่อการตรวจสอบ แต่ง่ายต่อการตรวจสอบ

หากคุณเคยพบวิธีที่จะย้อนแฮชย่อย SHA256 ได้อย่างมีประสิทธิภาพเพื่อสร้างข้อความ (ข้อความใด ๆ ) ที่จะส่งผลให้แฮชนั้นเป็นข้อพิสูจน์โดยการสาธิตว่าจริงๆแล้วแฮชนั้นเสียขั้นพื้นฐาน ในความเป็นจริงแล้ว SHA256 เชื่อว่าปลอดภัยซึ่งหมายความว่าไม่มีวิธีการจัดทำเป็นเอกสารไม่ว่าจะใช้งานจริงได้อย่างไรเริ่มต้นด้วยแฮชย่อยและสร้างข้อความชนที่ต้องใช้งานน้อยกว่าการพยายามทุกอย่างที่เป็นไปได้ (สำหรับ SHA-256 ^ 256 ~ = 10 ^ 77 ความเป็นไปได้)


มันอาจจะคุ้มค่าที่จะกล่าวถึงเช่นกันว่าในฟังก์ชั่นแฮชในอุดมคติการเปลี่ยนแปลงแบบบิตเดียวในอินพุตควรส่งผลให้มีการเปลี่ยนแปลง 50% ของบิตเอาต์พุต มันเรียกว่าผลหิมะถล่ม
CVn

2
@ MichaelKjörling: ใส่อย่างถูกต้องเราควรคาดหวังว่าแต่ละบิตจะเปลี่ยนแปลงด้วยความน่าจะเป็น 50% ซึ่งแตกต่างจาก (แต่บอกเป็นนัย) คาดว่า 50% ของบิตจะเปลี่ยนโดยเฉลี่ย
Dietrich Epp

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