Score:1

การสร้างและเข้ารหัสคีย์ HMAC

ธง ng

ฉันมีรหัส. NET ชิ้นนี้ซึ่งอ้างอิงจากไฟล์ ตัวอย่าง Microsoft เกี่ยวกับวิธีสร้างคีย์และเซ็นชื่อโดยใช้ HMACSH256.

แต่ฉันได้แก้ไขการสร้างคีย์เล็กน้อยและตัดสินใจใช้ Base64 เพื่อขนส่งคีย์เป็นสตริง:

การสร้างคีย์:

ไบต์ [] รหัสลับ = ไบต์ใหม่ [64];

ใช้ (RNGCryptoServiceProvider rng = ใหม่ RNGCryptoServiceProvider())
{
    rng.GetBytes (รหัสลับ);
    ใช้ (SHA512 mySHA256 = SHA512.Create())
    {
          var hashedKey = mySHA256.ComputeHash (รหัสลับ);
          var encodedKey = Convert.ToBase64String(hashedKey);
          ส่งคืนรหัสเข้ารหัส
    }
}

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

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

นอกจากนี้ มีปัญหาใด ๆ เกี่ยวกับการขนส่งคีย์เป็นสตริง Base64 หรือไม่

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

Score:1

การแฮชทั้งหมดจะทำคือแนะนำการสุ่มเพิ่มเติม

ไม่ได้ คุณไม่สามารถแนะนำการสุ่มด้วยกระบวนการที่กำหนดขึ้นได้ คุณสามารถแนะนำการสุ่มด้วยแหล่งข้อมูลสุ่มจริงเท่านั้น

คุณสามารถใช้แฮชเป็น ส่วนประกอบ ของตัวสร้างสุ่มเทียม และตัวสร้างสุ่มเทียม (มีความปลอดภัยในการเข้ารหัส!) นั้นดีพอสำหรับการเข้ารหัสที่ต้องการการสุ่ม แต่องค์ประกอบที่สำคัญอีกอย่างของตัวสร้างสุ่มเทียมนั้นเป็นความลับ ความลับนั้นคือสถานะของตัวสร้างการสุ่ม ซึ่งได้มาจากเมล็ดสุ่ม: ตัวสร้างการสุ่มเทียมไม่ได้สร้างการสุ่ม มันแค่ “คูณ” ในแง่ที่ว่ามันสามารถเปลี่ยนข้อมูลสุ่มจำนวนเล็กน้อยให้กลายเป็นข้อมูลขนาดใหญ่ จำนวนข้อมูลสุ่ม

การแฮชสตริงแบบสุ่มจะลดความสุ่มเท่านั้น: ในทางทฤษฎีเป็นไปได้ว่าสตริงอินพุตสองสตริงมีแฮชเดียวกัน (คุณจะไม่พบสตริงดังกล่าวจริง ๆ และเราไม่แน่ใจว่ามีอยู่จริง แต่มีโอกาสเป็นเช่นนั้น) การสุ่มจะลดลงเพียงเล็กน้อยเท่านั้น ดังนั้นนี่จึงไม่ใช่ช่องโหว่ที่แท้จริงในโค้ดของคุณ แต่เป็นการแทรกซ้อนที่ไม่จำเป็นและเป็นการต่อต้าน

วิธีการเพิ่มการสุ่มให้ได้มากที่สุดคือการรับเอาต์พุตจากเครื่องกำเนิดการสุ่ม เรียก rng.GetBytes (รหัสลับ) และหยุดอยู่แค่นั้น

การแปลงคีย์เป็น Base64 เพื่อการขนส่งและจากนั้นกลับเป็นไบนารีเพื่อใช้งานไม่มีผลกระทบต่อการเข้ารหัส มันเป็นเพียงการเข้ารหัส ถอดรหัส: การใช้ Base64 เป็นคีย์อาจลดความปลอดภัยเนื่องจากแต่ละไบต์มีค่าที่เป็นไปได้เพียง 1/4 เท่านั้น (วิธีที่ HMAC ใช้คีย์นั้น ไม่สำคัญว่าคุณจะใช้ ฐาน 64 (random_bytes (64)) หรือ Random_bytes (64) เป็นกุญแจ แต่สิ่งนี้จะมีความสำคัญ ตัวอย่างเช่น สำหรับคีย์ AES ซึ่งมีความยาวที่ยอมรับไม่ได้ด้วยซ้ำ)

danutz_plusplus avatar
ng flag
ขอบคุณสำหรับโพสต์ที่ส่องสว่าง ใช่ ตอนนี้คุณพูดถึงมันแล้ว มันชัดเจนว่าเนื่องจากไดเจสต์อยู่ในช่องว่างของค่าที่ลดลง มันจะลดลงในทางทฤษฎี ตอนนี้ฉันคิดเกี่ยวกับมัน ฉันได้รับแนวคิดจากระบบอื่นที่ฉันเห็นว่าพวกเขาใช้รหัสผ่านที่สร้างขึ้นแบบสุ่ม (ไม่ให้คนใช้จริง) และพวกเขาแฮชค่าก่อนที่จะจัดเก็บ แต่เมื่อฉันคิดเกี่ยวกับมัน ฉันคิดว่านั่นเป็นจุดประสงค์มากกว่าที่จะไม่อนุญาตให้ทำวิศวกรรมย้อนกลับค่าของพวกเขา ตามปกติที่คุณทำกับรหัสผ่าน
danutz_plusplus avatar
ng flag
เกี่ยวกับการเข้ารหัส ใช่ ฉันคิดว่าฉันต้องถอดรหัสก่อนที่จะใช้มัน โชคดีที่ API นั้นฉลาดพอที่จะไม่ยอมรับแม้แต่สตริง ยอมรับเฉพาะไบต์ []
danutz_plusplus avatar
ng flag
นอกจากนี้ โปรดอย่าสนใจคำซ้ำๆ ของ "ตอนนี้ที่ฉันคิดเกี่ยวกับมัน" ดูเหมือนว่าฉันไม่ได้คิดอย่างรอบคอบในคำตอบและแก้ไขมันต่อไปจนกระทั่งมันจัดการได้เกือบทั้งหมด :D และตอนนี้ฉันไม่สามารถแก้ไขได้เป็นเวลา 5 นาที :D

โพสต์คำตอบ

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