แฮชและการเข้ารหัส? ค่าแฮชคืออะไรการเข้ารหัสแฮชคืออะไรและการถอดรหัสแฮชคืออะไร

แฮชและการเข้ารหัส

มีความเข้าใจผิดทั่วไปว่าแฮชและการเข้ารหัสเป็นสิ่งเดียวกัน พวกเขาไม่ได้ แฮชย้อนกลับไม่ได้ ยกตัวอย่างต่อไปนี้:

$ echo -n Password123 | md5sum
42f749ade7f9e195bf475f37a44cafcb -

เราส่งสตริง "Password123" ไปยังอัลกอริทึม MD5 (อัลกอริทึม) ซึ่งดำเนินการทางคณิตศาสตร์และส่งคืนแฮชที่เข้ารหัสเลขฐานสิบหกที่สร้างขึ้น วิธีเดียวที่จะได้ค่าเอาต์พุตแฮชเดียวกันคือการป้อนอัลกอริโกดั้งเดิม มีความขัดแย้ง แต่เราจะคุยกันทีหลัง

ผลลัพธ์ของอัลกอริธึมแฮชส่วนใหญ่คือสตริงไบนารีความยาวคงที่ที่เข้ารหัสเลขฐานสิบหก คนอื่นๆ เช่นตัวอย่างนี้ ใช้สตริงที่เข้ารหัส base64 เป็นเอาต์พุต โปรดทราบว่าความยาวจะเท่ากันเสมอ:

{SHA} uNF8eZRJ8jmr8WTjyocRJPVpe7w=
{SHA}lqdu/Zr6o2dgIER8Up1/7lcUtgw=
{SHA}qYUOwLMlDEuukA5HCT4LR1kQzco=
{SHA}MXZBCpyWJ7TTs1w2kgGJslwNwTg=
{SHA}2sAPLaUh9Mz0bI XxKEg7qyABe8=

TL; ดร.

การเข้ารหัสสามารถย้อนกลับได้และแฮชไม่ใช่


ฉันไม่อยากพูดถึงการเข้ารหัสมากเกินไป (เพราะสิ่งเหล่านั้นมีไว้สำหรับหนังสือ) แต่สิ่งสำคัญคือต้องสามารถแยกแยะระหว่างสตริงแฮชและสตริงที่เข้ารหัสได้ การเข้ารหัสมักจะเติมสตริงที่มีความยาวเฉพาะก่อนที่การเข้ารหัสจะเกิดขึ้น นอกจากนี้ยังต้องใช้คีย์ (หรือรหัสผ่าน) ในการถอดรหัส หากใช้รหัสผ่านที่เข้ารหัส สตริงจะแตกต่างกันไปตามความยาวของอินพุต หากคุณเห็นรหัสผ่านไซเฟอร์เท็กซ์จำนวนมากที่มีความยาวแตกต่างกัน คุณอาจกำลังจัดการกับการเข้ารหัสแทนการแฮช ตัวอย่าง AES-256-CBC สตริงที่เข้ารหัสและข้อความธรรมดาที่เกี่ยวข้อง (คีย์ "ASDF"):

foobar             | U2FsdGVkX19G+KtytNHdj6yH2AVvX26pEmtunS/PRnU= 
foobarfoobar       | U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog= 
foobarfoobarfoobar | U2FsdGVkX1/EOnUt57TCW4Rh0EdNnWX lDatuQv2xEXXeAeowW0XG/EXJUe9aSUz 

$ cat รหัสผ่านที่เข้ารหัส 
U2FsdGVkX19G KtytNHdj6yH2AVvX26pEmtunS/PRnU= 
U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog= 
U2FsdGVkX1/EOnUt57TCW4Rh0EdNnWX lDatuQv2xEXXeAeowW0XG/EXJUe9aSUz 

$ สำหรับ i ใน `cat รหัสผ่านที่เข้ารหัส`;  do echo $i | openssl enc -base64 -d -aes-256-cbc - ผ่าน ผ่าน:asdf;  เสียงสะท้อน;  เสร็จแล้ว 
ฟูบาร์ 
foobarfoobar ฟูบาร์ 
foobarfoobarfoobar

ตอนนี้คุณอาจคิดว่า: คุณอาจจะถูก อย่างไรก็ตาม เนื้อหาสำคัญจะต้องสามารถเข้าถึงได้โดยระบบ ซึ่งหมายความว่ารหัสผ่านหลักข้อความธรรมดาจะอยู่ที่ไหนสักแห่ง - ไม่ว่าจะเป็นคีย์ RSA หรือรหัสผ่าน หรือในไฟล์ ฝังอยู่ในฐานข้อมูล ฮาร์ดโค้ดในแอปพลิเคชัน หรือในหน่วยความจำ รหัสผ่านสำหรับสถานที่ใดสถานที่หนึ่ง pfft ไม่มีใคร'จะใช้ asdf เป็นกุญแจในการเข้ารหัสรหัสผ่านของผู้ใช้'

ใช้สตริงเดียวกันกับ MD5:

foobar             | 3858f62230ac3c915f300c664312c63f 
foobarfoobar       | 59faa421729e846dd800dce59943bfc0 
foobarfoobarfoobar | 1352aadab322d1a033c27964be0965db

รหัสผ่านแฮชยังห่างไกลจากความสมบูรณ์แบบในความเป็นจริงมันเลวร้ายเล็กน้อย แต่มันแย่กว่าการเข้ารหัสเพราะสิ่งที่มันพยายามที่จะบรรลุ ผู้ใช้เลือกข้อกำหนดขั้นต่ำที่แน่นอนบ่อยกว่า not และยังสามารถใช้งานได้ในหลายไซต์ จริงๆ แล้ว "แฮ็ก" จำนวนมากไม่มีอะไรมากไปกว่าการโจมตีการใช้ข้อมูลประจำตัวซ้ำ หากการประนีประนอมเริ่มต้นคือการใช้การเข้ารหัส ความพยายามเพียงอย่างเดียวที่ผู้โจมตีต้องทำคือการค้นหากุญแจในการถอดรหัสรหัสผ่านทั้งหมด สำหรับแฮช อย่างน้อยพวกเขาต้องใช้ความพยายามในการถอดรหัสพวกมัน เมื่อใช้กับอัลกอริธึมสมัยใหม่ เช่น sha512crypt, bcrypt, scrypt หรือ argon2 ค่าแฮชอาจต้องใช้ความพยายามอย่างมากในการถอดรหัส



หมัก

เกลือคือการเพิ่มสตริงลงในรหัสผ่านก่อนแฮช เกลือของแต่ละแฮชควรไม่ซ้ำกัน โดยปกติจะเลือกแบบสุ่ม เนื่องจากจุดเน้นคือการทำให้ค่าแฮช "รหัสผ่าน" ข้อความธรรมดาเดียวกันมีค่าที่แตกต่างกันในแต่ละครั้ง สิ่งนี้ทำให้ชีวิตของผู้ถอดรหัสลำบาก เพราะเพื่อที่จะตรวจสอบคำว่า "รหัสผ่าน" ของผู้ใช้แต่ละคนใน 1,000 คน ผู้ใช้แต่ละคนจะมี SALT ที่ไม่ซ้ำกัน และพวกเขาจะต้องทำงาน 1,000 ครั้ง - ต่อผู้ใช้/เกลือครั้งเดียว นอกจากนี้ยังหมายความว่าพวกเขาไม่สามารถใช้พจนานุกรมที่คอมไพล์ไว้ล่วงหน้าหรือตาราง rainbow ได้อย่างมีประสิทธิภาพ (โดยปกติแล้ว...) เนื่องจากต้องใช้พจนานุกรมที่กำหนดเองต่อเกลือ

เว็บไซต์บางครั้งทำสิ่งนี้พังและใช้เกลือสากลสำหรับผู้ใช้ทุกคน สิ่งนี้ขัดกับวัตถุประสงค์

ต่อไปนี้คือค่าแฮช SHA1 ที่มีเกลือ:


b353977827f67a4ae0318f3a9447fae1c13d9d90:b8d18ca 
|___________________________________________| 
                  แฮช                  |  เกลือ 
                                        | 
                                    ตัวคั่น

ข้อความธรรมดาของแฮชนี้คือ "รหัสผ่าน" ค่าเกลือของมันคือ "b8d18ca" และใช้ API ของ SHA1($salt.$pass) ซึ่งหมายความว่าอัลกอริธึมจะรับข้อความธรรมดาของรหัสผ่าน สร้างเกลือ และเพิ่มไว้ด้านหน้าของข้อความธรรมดา เมื่อเว็บไซต์หรือแอปพลิเคชันพยายามยืนยันรหัสผ่านของคุณ ในอนาคตจะใช้รหัสผ่านข้อความธรรมดาของคุณเป็นอินพุต อ่านค่าเกลือในแฮชที่จัดเก็บไว้ เพิ่มไว้ด้านหน้ารหัสผ่านที่คุณเลือก และเปรียบเทียบค่าแฮชที่สร้างขึ้นกับค่าแฮชที่จัดเก็บไว้ การแคร็ก หากคุณไม่รู้ว่าส่วนหนึ่งของมันคือเกลือ แฮชจะสร้างข้อความธรรมดาต่อไปนี้:

b8d18capassword

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

การทำเกลืออาจทำให้การแตกร้าวใช้เวลานานมากขึ้นหากดำเนินการอย่างถูกต้อง การใช้เกลือแบบสุ่ม คุณจะบังคับให้ Cracker เสียเวลาในการพยายามถอดรหัสค่าแฮชที่ไม่ตรงกันของเกลือ นี่เป็นความพยายามโดยประมาณที่จำเป็นสำหรับ device_speed / number_of_salts เนื่องจากเราจำเป็นต้องสร้างผู้สมัครสำหรับเกลือแต่ละชนิด หากเกลือเป็นแบบคงที่ การดำเนินการทางคณิตศาสตร์ก็เหมือนกัน...speed_of_device / 1. อีกวิธีหนึ่งในการดูสิ่งนี้:

ของเรา GTX 980 รอยแตก SHA1($salt.$pass) ที่ 3576.8 MH/s หรือ 3.5 พันล้าน ผู้สมัคร ต่อ วินาที 
 แฮชลิสต์ ของเราประกอบด้วย 1000 เกลือที่ไม่ซ้ำกัน  

3,500,000,000 / 1000 = 3,500,000 ผู้สมัคร ต่อ วินาที

ซึ่งช้าลงสามลำดับและสูญเสียไป 99.9% เมื่อใช้เกลือแบบคงที่ จะมีลักษณะดังนี้:

 GTX 980 รอยแตก SHA1($salt.$pass) ที่ 3576.8 MH/s หรือ 3.5 พันล้าน ผู้สมัคร ต่อ วินาที 
 แฮชลิสต์ ของเรามี 1 เกลือที่ไม่ซ้ำกัน  
               
3,500,000,000 / 1 = 3,500,000,000 ผู้สมัคร ต่อ วินาที

หากสิ่งนี้ไม่สมเหตุสมผล โปรดอ่านต่อ เราจะมีแผนภูมิที่สวยงามในภายหลัง...


การวนซ้ำ

การปรับปรุงทั่วไปอีกประการหนึ่งเมื่อเทียบกับการ "แฮชข้อความธรรมดานี้" คือ "แฮชข้อความธรรมดานี้ จากนั้นแฮชผลลัพธ์นั้น จากนั้นแฮชผลลัพธ์นั้น" ซ้ำหลายพันครั้ง ด้วยวิธีนี้ โปรแกรมถอดรหัสรหัสผ่านจะต้องทำหลายพันครั้งเมื่อลองใช้รหัสผ่านผู้สมัครคนเดียว สิ่งนี้เรียกว่าการวนซ้ำ วงจร หรือต้นทุนผันแปร อัลกอริธึมการแฮชรหัสผ่านบางตัวใช้รอบการวนซ้ำที่เข้ารหัสยาก Git อื่นๆ ทำให้สามารถกำหนดค่าได้ในส่วนหนึ่งของแฮชเอง ตัวอย่างเช่น md5crypt() ใช้ MD5 รวมถึง salt และวนซ้ำพอดี 1000 ครั้ง sha512crypt() ใช้ sha512 รวมถึงเกลือและวนซ้ำจำนวนครั้งที่กำหนดค่าได้ (ค่าเริ่มต้นคือ 5,000)

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


อิทธิพลของประเภทแฮชต่อความเร็วในการแคร็ก

เรามาดูตัวอย่างบางส่วนเพื่อแสดงให้เห็นถึงอิทธิพลของการเลือกอัลกอริทึมแฮช ไม่ว่าจะเป็น salted, การใช้การวนซ้ำหลายครั้ง ฯลฯ สมมติว่าผู้โจมตีรวบรวมแฮชของผู้ใช้ 1,000 คน จากเว็บไซต์ที่ติดเชื้อและพวกเขาต้องการดำเนินการโจมตีง่ายๆ เพียงครั้งเดียว โดยทดสอบรหัสผ่านแต่ละรหัส แฮช - 143 ล้านรหัสผ่านผู้สมัคร

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

นั่นไม่ได้ผล! ประเภทแฮชที่แข็งแกร่งที่สุดนั้นช้ากว่ามาก แต่เร็วกว่า ประเภทนั้นถูกบดขยี้จนไม่มีอะไรเลย ลองใช้ขนาดข้อมูลเดิมอีกครั้งโดยใช้เวลาแกน X แบบลอการิทึม เมื่อแถบเคลื่อนที่จากซ้ายไปขวา พวกมันจะเพิ่มกำลัง 10:

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



ระบุประเภทของแฮช

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

มีแหล่งข้อมูลที่ยอดเยี่ยมสำหรับงานนี้ที่นี่และที่นี่ ซึ่งทั้งหมดแสดงให้เห็นว่าค่าแฮชทั่วไปมีลักษณะอย่างไร

แพ็คเกจ "hash-identifier" (มีอยู่ที่นี่) มีให้ใน Kali Linux เพื่อช่วยระบุประเภทแฮชที่ไม่รู้จัก



การชนกัน

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

Microsoft Office ใช้อัลกอริทึมที่มีแนวโน้มที่จะเกิดความขัดแย้งในการป้องกันเอกสารเป็นเวลาหลายปี ไม่ใช่เรื่องแปลกที่จะพบข้อขัดแย้งหลายครั้งสำหรับแฮชเดียว ซึ่งทั้งหมดนี้จะปลดล็อคเอกสาร

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


ก่อนหน้านี้:ฮาร์ดแวร์ถอดรหัสรหัสผ่าน hashcat
ถัดไป:Hashcat คืออะไร? ขั้นตอนแรกของการถอดรหัสรหัสผ่าน [บทนำพื้นฐาน]

บทความล่าสุด

แท็กยอดนิยม

บทความติดหนึบ

  • Word/Excel/Pdf/PPT/RAR/zip/7z在线密码破解
  • offfice、PDF、压缩文件、WPS、在线密码恢复
  • hashcatonline.com在线密码破解版权所有2010-2025