อัลกอริทึมการแฮ็นรหัสผ่านที่ใช้กันทั่วไปทำงานในลักษณะนี้วันนี้: ใส่รหัสผ่านและป้อนลงใน KDF ตัวอย่างเช่นการใช้ PBKDF2-HMAC-SHA1 กระบวนการแฮชรหัสผ่านคือDK = PBKDF2(HMAC, Password, Salt, ...)
รหัสผ่าน เนื่องจาก HMAC เป็น hashing 2 รอบพร้อมกับแป้นที่มีเบาะรองและ SHA1 เป็นชุดของการเรียงสับเปลี่ยนการหมุนการหมุนและการดำเนินการระดับบิตโดยพื้นฐานกระบวนการทั้งหมดจึงมีการดำเนินการพื้นฐานบางอย่างที่จัดเรียงในลักษณะที่แน่นอน ไม่ชัดเจนว่าเป็นเรื่องยากที่จะคำนวณ นั่นอาจเป็นเหตุผลว่าทำไมฟังก์ชั่นทางเดียวยังคงเป็นความเชื่อและเราได้เห็นฟังก์ชั่นแฮชการเข้ารหัสลับที่มีความสำคัญในอดีตบางอย่างกลายเป็นไม่ปลอดภัยและเลิกใช้แล้ว
ฉันสงสัยว่ามันเป็นไปได้ที่จะใช้ประโยชน์จากปัญหาที่สมบูรณ์ของ NP เพื่อแฮรหัสผ่านในรูปแบบใหม่โดยหวังว่าจะให้พื้นฐานทางทฤษฎีที่มั่นคงยิ่งขึ้น แนวคิดหลักคือสมมติว่า P! = NP (ถ้า P == NP แล้วไม่มี OWF ดังนั้นรูปแบบปัจจุบันจะแตกเช่นกัน) การเป็นปัญหา NPC หมายถึงคำตอบนั้นง่ายต่อการตรวจสอบ แต่ยากที่จะคำนวณ คุณสมบัตินี้เหมาะสมกับข้อกำหนดของการแฮ็กรหัสผ่าน หากเราดูรหัสผ่านเป็นคำตอบของปัญหา NPC เราสามารถเก็บปัญหา NPC ไว้เป็นแฮชของรหัสผ่านเพื่อตอบโต้การโจมตีออฟไลน์: มันง่ายต่อการตรวจสอบรหัสผ่าน แต่ยากที่จะถอดรหัส
ข้อแม้คือรหัสผ่านเดียวกันอาจถูกแมปกับหลายอินสแตนซ์ของปัญหา NPC อาจไม่ใช่ทั้งหมดที่ยากต่อการแก้ไข เป็นขั้นตอนแรกในการวิจัยนี้ฉันพยายามตีความสตริงไบนารีเป็นคำตอบของปัญหา 3-SAT และเพื่อสร้างอินสแตนซ์ของปัญหา 3-SAT ที่สตริงไบนารีเป็นวิธีแก้ปัญหา ในรูปแบบที่ง่ายที่สุดสตริงไบนารีมี 3 บิต: x_0, x_1, x_2 จากนั้นมี 2 ^ 3 == 8 ข้อ:
000 ( (x_0) v (x_1) v (x_2) )
--------------------------------------
001 ( (x_0) v (x_1) v NOT(x_2) )
010 ( (x_0) v NOT(x_1) v (x_2) )
011 ( (x_0) v NOT(x_1) v NOT(x_2) )
100 ( NOT(x_0) v (x_1) v (x_2) )
101 ( NOT(x_0) v (x_1) v NOT(x_2) )
110 ( NOT(x_0) v NOT(x_1) v (x_2) )
111 ( NOT(x_0) v NOT(x_1) v NOT(x_2) )
สมมติว่าสตริงไบนารี่เป็น 000 จากนั้นข้อ 1 ใน 8 ข้อเท่านั้นเป็นเท็จ (อันแรก) หากเราละทิ้งประโยคแรกและและส่วนที่เหลืออีก 7 ข้อแล้ว 000 เป็นคำตอบของสูตรผลลัพธ์ ดังนั้นถ้าเราเก็บสูตรจากนั้นเราสามารถตรวจสอบได้ 000
ปัญหาคือสำหรับสตริง 3 บิตหากคุณเห็นประโยคที่ต่างกัน 7 ข้อคุณก็จะรู้ทันทีว่าข้อใดหายไปและนั่นจะเผยให้เห็นบิต
ดังนั้นในภายหลังฉันจึงตัดสินใจทิ้ง 3 รายการโดยเก็บเฉพาะ 4 รายการที่ทำเครื่องหมายไว้ด้วย 001, 010, 100 และ 111 ซึ่งบางครั้งจะแนะนำการชน แต่ทำให้การแก้ปัญหาน้อยลงเล็กน้อย การชนไม่ได้เกิดขึ้นเสมอไป แต่ไม่ว่าพวกมันจะหายไปหรือไม่
แก้ไข ในกรณีทั่วไปที่สตริงไบนารีสามารถเป็นใด ๆ (000, 001, ... , 111) ยังคงมี 8 ข้อที่ 7 เป็นจริงและ 1 เป็นเท็จ เลือก 4 ข้อที่ให้ความจริง (001, 010, 100, 111) นี่สะท้อนให้เห็นในการใช้งานต้นแบบด้านล่าง
แก้ไข ตามคำตอบที่แสดงโดย @DW ด้านล่างวิธีการเลือกคำสั่งนี้อาจยังคงส่งผลให้มีคำสั่งมากเกินไปในชุดของตัวแปรที่กำหนดซึ่งทำให้สามารถ จำกัด ค่าได้อย่างรวดเร็ว มีวิธีอื่นในการเลือกส่วนคำสั่งในข้อ 7 * C (n, 3) ตัวอย่างเช่น: เลือกข้อที่แตกต่างจากชุดของตัวแปรที่กำหนดและทำเฉพาะสำหรับตัวแปรที่อยู่ติดกัน ((x_0, x_1, x_2), (x_1, x_2, x_3), (x_2, x_3, x_4), .. .) และทำให้เกิดวงรอบแทนกลุ่ม วิธีนี้น่าจะใช้งานไม่ได้เช่นกันเพราะคุณสามารถลองการมอบหมายโดยใช้การเหนี่ยวนำเพื่อทดสอบว่าทุกข้อสามารถพอใจได้หรือไม่ ดังนั้นเพื่อให้ง่ายในการอธิบายโครงสร้างโดยรวมลองใช้วิธีการปัจจุบัน
จำนวนอนุประโยคสำหรับสตริง n-bit คือ 4 * C (n, 3) = 4 * n * (n - 1) * (n - 2) / 6 = O (n ^ 3) ซึ่งหมายถึงขนาดของhashคือพหุนามของขนาดรหัสผ่าน
มีการดำเนินงานต้นแบบในหลามเป็นที่นี่ มันสร้างอินสแตนซ์ปัญหา 3-SAT จากสตริงไบนารี่อินพุตของผู้ใช้
หลังจากการแนะนำที่ยาวนานนี้ในที่สุดคำถามของฉัน:
โครงสร้างด้านบน (ตามที่นำมาใช้ในต้นแบบ) ทำงานเป็น hashing รหัสผ่านที่ปลอดภัยหรืออย่างน้อยก็ดูมีแนวโน้มที่สามารถแก้ไขได้ ฯลฯ ? ถ้าไม่มันล้มเหลวที่ไหน?
เนื่องจากเรามี 7 * C (n, 3) ส่วนคำสั่งให้เลือกเป็นไปได้หรือไม่ที่จะหาวิธีอื่นในการสร้างอินสแตนซ์ 3-SAT ที่ปลอดภัยเหมาะสำหรับใช้เป็นแฮชรหัสผ่านอาจเป็นไปได้ด้วยการสุ่ม
มีงานใดที่คล้ายกันที่พยายามยกระดับความสมบูรณ์ของ NP เพื่อออกแบบแผนการแฮ็ชรหัสผ่านที่ปลอดภัยและได้รับผลลัพธ์บางอย่างแล้ว (ทั้งบวกหรือลบ)? ยินดีต้อนรับสู่ intros และลิงค์บางอย่าง
แก้ไข ฉันยอมรับคำตอบด้านล่างโดย @DW ซึ่งเป็นคนแรกที่ตอบและให้ข้อมูลเชิงลึกเกี่ยวกับโครงสร้างปัญหารวมถึงทรัพยากรที่มีประโยชน์ รูปแบบการเลือกประโยคไร้เดียงสาที่แนะนำที่นี่ (ตามที่นำมาใช้ในต้นแบบ Python) ดูเหมือนจะไม่ทำงานเพราะมันเป็นไปได้ที่จะ จำกัด การกำหนดตัวแปรในกลุ่มเล็ก ๆ อย่างรวดเร็ว อย่างไรก็ตามปัญหายังคงเปิดอยู่เพราะฉันไม่ได้เห็นการพิสูจน์อย่างเป็นทางการที่แสดงว่าการลดลงของรหัสผ่านการแฮ็ช NPC เป็นรหัสผ่านดังกล่าวจะไม่ทำงานเลย แม้แต่ปัญหาการลด 3-SAT นี้โดยเฉพาะอาจมีวิธีการเลือกคำสั่งต่าง ๆ ที่ฉันไม่ต้องการระบุที่นี่ ดังนั้นการปรับปรุงและการสนทนาใด ๆ ยังคงยินดีอย่างมาก