คำถามติดแท็ก cryptography

CRYPTOGRAPHY ต้องมีการเขียนโปรแกรมที่เกี่ยวข้อง การเข้ารหัสครอบคลุมเหนือสิ่งอื่นใดการเข้ารหัสการแฮชและลายเซ็นดิจิทัล คำถามเกี่ยวกับการเข้ารหัสที่ไม่เกี่ยวข้องโดยตรงกับการพัฒนาซอฟต์แวร์ควรถามที่ crypto.stackexchange.com

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

16
การแฮช MD5 ใน Android
ฉันมีไคลเอนต์ Android ที่เรียบง่ายซึ่งต้องการ 'พูดคุย' กับผู้ฟัง C # HTTP แบบธรรมดา ฉันต้องการให้การรับรองความถูกต้องระดับพื้นฐานโดยการส่งชื่อผู้ใช้ / รหัสผ่านในคำขอ POST การแฮช MD5 นั้นไม่สำคัญใน C # และให้ความปลอดภัยเพียงพอสำหรับความต้องการของฉัน แต่ฉันไม่สามารถหาวิธีทำสิ่งนี้ได้ในตอนท้ายของ Android แก้ไข: เพื่อจัดการกับข้อกังวลที่เกิดขึ้นเกี่ยวกับจุดอ่อนของ MD5 - เซิร์ฟเวอร์ C # ทำงานบนพีซีของผู้ใช้ไคลเอนต์ Android ของฉัน ในหลาย ๆ กรณีพวกเขาจะเข้าถึงเซิร์ฟเวอร์โดยใช้ wi-fi บน LAN ของตนเอง แต่พวกเขาอาจเลือกที่จะเข้าถึงเซิร์ฟเวอร์จากอินเทอร์เน็ตด้วยความเสี่ยง นอกจากนี้บริการบนเซิร์ฟเวอร์จำเป็นต้องใช้การส่งผ่านสำหรับ MD5 ไปยังแอปพลิเคชันของบุคคลที่สามที่ฉันไม่สามารถควบคุมได้

16
ทำไมค่าแฮช MD5 จึงไม่สามารถย้อนกลับได้?
แนวคิดหนึ่งที่ฉันสงสัยมาตลอดคือการใช้ฟังก์ชันแฮชและค่าที่เข้ารหัสลับ ฉันเข้าใจว่าฟังก์ชันเหล่านี้สามารถสร้างค่าแฮชที่ไม่เหมือนใครและแทบไม่สามารถย้อนกลับได้ แต่นี่คือสิ่งที่ฉันสงสัยมาตลอด: หากบนเซิร์ฟเวอร์ของฉันใน PHP ฉันสร้าง: md5("stackoverflow.com") = "d0cc85b26f2ceb8714b978e07def4f6e" เมื่อคุณเรียกใช้สตริงเดียวกันผ่านฟังก์ชัน MD5 คุณจะได้ผลลัพธ์เดียวกันกับการติดตั้ง PHP ของคุณ มีการใช้กระบวนการเพื่อสร้างมูลค่าจากค่าเริ่มต้นบางส่วน นี่ไม่ได้หมายความว่ามีวิธีแยกโครงสร้างสิ่งที่เกิดขึ้นและย้อนกลับค่าแฮชหรือไม่? มันเกี่ยวกับฟังก์ชันเหล่านี้ที่ทำให้สตริงผลลัพธ์ไม่สามารถย้อนกลับได้?


9
เกลือที่ไม่สุ่มสำหรับแฮชรหัสผ่าน
อัปเดต: เมื่อเร็ว ๆ นี้ฉันได้เรียนรู้จากคำถามนี้ว่าในการสนทนาทั้งหมดด้านล่างฉัน (และฉันแน่ใจว่าคนอื่น ๆ ก็ทำเช่นกัน) ค่อนข้างสับสน: สิ่งที่ฉันเรียกตารางสายรุ้งนั้นแท้จริงแล้วเรียกว่าตารางแฮช ตารางสายรุ้งเป็นสิ่งมีชีวิตที่ซับซ้อนกว่าและเป็นรูปแบบหนึ่งของ Hellman Hash Chains แม้ว่าฉันจะเชื่อว่าคำตอบนั้นยังคงเหมือนเดิม (เนื่องจากไม่ได้มีการเข้ารหัสลับ) การสนทนาบางส่วนอาจจะเบี้ยวเล็กน้อย คำถาม: " อะไรคือตารางรุ้งและวิธีการที่พวกเขาใช้? " โดยปกติฉันมักจะแนะนำให้ใช้ค่าสุ่มที่มีการเข้ารหัสที่แข็งแกร่งเป็นเกลือเสมอเพื่อใช้กับฟังก์ชันแฮช (เช่นรหัสผ่าน) เช่นเพื่อป้องกันการโจมตีของ Rainbow Table แต่จริง ๆ แล้วมันจำเป็นสำหรับการสุ่มเกลือหรือไม่? ค่าที่ไม่ซ้ำกัน (ไม่ซ้ำกันต่อผู้ใช้เช่น userId) จะเพียงพอหรือไม่ในเรื่องนี้ ในความเป็นจริงมันจะป้องกันไม่ให้ใช้ Rainbow Table เดียวเพื่อถอดรหัสรหัสผ่านทั้งหมด (หรือส่วนใหญ่) ในระบบ ... แต่การขาดเอนโทรปีทำให้ความแข็งแกร่งในการเข้ารหัสของฟังก์ชันแฮชลดลงหรือไม่? หมายเหตุฉันไม่ได้ถามว่าทำไมต้องใช้เกลือวิธีการป้องกัน (ไม่จำเป็นต้องเป็น) การใช้แฮชคงที่เดียว (ไม่ต้อง) หรือฟังก์ชันแฮชประเภทใดที่จะใช้ เพียงแค่ว่าเกลือต้องการเอนโทรปีหรือไม่ ขอบคุณทุกคนสำหรับคำตอบจนถึงตอนนี้ แต่ฉันอยากจะเน้นในส่วนที่ฉันไม่ค่อยคุ้นเคย (นิดหน่อย) ผลกระทบส่วนใหญ่สำหรับการเข้ารหัส …

13
เหตุใดจึงต้องใช้ C # class System.Random แทน System.Security.Cryptography.RandomNumberGenerator
ทำไมใคร ๆ ก็ใช้ตัวสร้างตัวเลขสุ่ม "มาตรฐาน" จากSystem.Randomเลยแทนที่จะใช้ตัวสร้างตัวเลขสุ่มที่ปลอดภัยด้วยการเข้ารหัสลับจากSystem.Security.Cryptography.RandomNumberGenerator (หรือคลาสย่อยเนื่องจาก RandomNumberGenerator เป็นนามธรรม) Nate Lawson บอกเราในงานนำเสนอของ Google Tech Talk ว่า " Crypto Strikes Back " ในนาทีที่ 13:11 ว่าอย่าใช้เครื่องกำเนิดตัวเลขสุ่ม "มาตรฐาน" จาก Python, Java และ C # และให้ใช้เวอร์ชันที่มีการเข้ารหัสลับที่ปลอดภัยแทน ฉันรู้ความแตกต่างระหว่างเครื่องสร้างตัวเลขสุ่มทั้งสองเวอร์ชัน (ดูคำถาม 101337 ) แต่มีเหตุผลอะไรบ้างที่จะไม่ใช้ตัวสร้างตัวเลขสุ่มที่ปลอดภัยเสมอไป? ทำไมต้องใช้ System.Random เลย? ประสิทธิภาพบางที?
87 c#  .net  cryptography  random 

2
ฉันสามารถใช้ตัวจัดสรรที่กำหนดเองสำหรับ std :: array สำหรับคีย์การเข้ารหัสที่ปลอดภัยได้หรือไม่
ฉันรู้ว่าstd::arrayจัดสรรอย่างสมบูรณ์ในสแต็ก แต่คำถามนี้ได้รับแรงบันดาลใจจากความกังวลด้านความปลอดภัยที่ต้องการสองสิ่ง: ข้อมูลในstd::arrayจะถูก zerod หรือสุ่มเมื่อถูกทำลาย ข้อมูลในstd::arrayจะถูกล็อคเพื่อไม่ให้ไปที่ดิสก์ไม่ว่าจะเกิดข้อผิดพลาดหรือในหน่วยความจำสลับ มักจะมีstd::vectorวิธีการแก้ปัญหาคือการสร้างจัดสรรที่กำหนดเองที่ทำสิ่งเหล่านี้ อย่างไรก็ตามสำหรับstd::arrayฉันไม่เห็นวิธีการทำเช่นนี้และด้วยเหตุนี้คำถามนี้ สิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือ: template <typename T, std::size_t Size> struct SecureArray : public std::array<T, Size> { static_assert(std::is_pod<T>::value, "Only POD types allowed") static_assert(sizeof(T) == 1, "Only 1-byte types allowed") virtual ~SecureArray() { std::vector<uint8_t> d = RandomBytes(Size); // generates Size random bytes std::memcpy(this->data(), d.data(), Size); } } …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.