Score:2

ฉันควรใช้ HMAC เพื่อสร้างโทเค็น HASH หลายส่วนหรือไม่

ธง jp

ฉันมีเว็บ API ที่มีระบบตรวจสอบสิทธิ์ API แบบกำหนดเองที่ผู้ใช้แต่ละคนมี ซีเคร็ทคีย์ และประชาชนทั่วไป อภิคีย์. การใช้ไคลเอนต์ (หรือผู้ใช้) คีย์ทั้งสองนี้สามารถสร้างโทเค็นสำหรับการรับรองความถูกต้องบนเซิร์ฟเวอร์

พิจารณาว่าฟังก์ชันนี้สร้างโทเค็นการตรวจสอบสิทธิ์

GetToken สตริงสาธารณะ (สตริง apiKey, สตริง secretKey, สตริงหมดอายุการประทับเวลา)
{
    ใช้ var hashAlgorithm = SHA256.Create();
    var byteValue = Encoding.UTF8.GetBytes(apiKey + secretKey +หมดอายุการประทับเวลา)
    var byteHash = hashAlgorithm.ComputeHash(byteValue)
    ส่งคืน Convert.ToBase64String (byteHash) + ประทับเวลาหมดอายุ
}

ดังนั้นโทเค็นจึงเป็นการรวมกันของ

$$token = SHA256(APIKey \mathbin\| SecretKey \mathbin\| หมดอายุการประทับเวลา) \mathbin\| การประทับเวลาหมดอายุ $$

การใช้โทเค็นนี้ทำให้เรามีระบบการตรวจสอบสิทธิ์ที่ไม่ซ้ำใครสำหรับ API ของเรา

คำถาม:

  1. ฉันควรเชื่อมต่อคีย์ + expTime หรือฉันควรใช้บางอย่างเช่น HMAC สถานการณ์นี้เสี่ยงต่อการถูกโจมตีหรือไม่ การโจมตีแบบขยายความยาว ไม่มี HMAC?
  2. ช่องโหว่ของระบบนี้คืออะไร (ถ้ามี)?
fgrieu avatar
ng flag
ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม [ย้ายไปแชท](https://chat.stackexchange.com/rooms/132054/discussion-on-question-by-alireza-should-i-use-hmac-to-create-a-multiple-part -ฮา).
Score:2
ธง in

โดยใช้ $$token = SHA256(APIKey \mathbin\| SecretKey \mathbin\| หมดอายุการประทับเวลา) \mathbin\| การประทับเวลาหมดอายุ $$

ไม่ปลอดภัยเนื่องจากอาจทำให้เกิดการโจมตีแบบขยายความยาวได้ เช่น

$$token2 = SHA256(APIKey \mathbin\| SecretKey \mathbin\| expiderTimestamp \| \color{red}{extension}) \mathbin\| (expireTimestamp \| \color{red}{extension}) $$

นี่เป็นโทเค็นที่ถูกต้องสำหรับการปลอมแปลง

NIST ในการโทรหาผู้สมัคร SHA3 จะต้องเป็น ทนต่อการยืด-ยาว การโจมตี. ตอนนี้ Keccak เสนอชื่อให้ SHA3 เป็นผู้ชนะ และ Blake2 ยังคงเป็นทางเลือกที่ดีจากการแข่งขัน ทั้งคู่ทนทานต่อการโจมตีแบบขยายความยาว Keccak โดยใช้ความจุและ Blake2 ใช้ ไฮฟา การก่อสร้างมีความปลอดภัยในการโจมตีส่วนขยาย

เพื่อลดการใช้ HMAC;

$$token = \operatorname{HMAC-SHA256}(คีย์ส่วนตัว, คีย์สาธารณะ \mathbin\| หมดอายุเวลาประทับ) \mathbin\| การประทับเวลาหมดอายุ $$ โปรดทราบว่าสิ่งนี้จะเรียก SHA-256 อย่างน้อยสองครั้ง (สามครั้งหากคีย์ยาวกว่าขนาดบล็อกของฟังก์ชันแฮช 512 บิตสำหรับ SHA-256)

แทนที่จะใช้ HMAC เราสามารถใช้ BLAKE2 ได้ BLAKE2 เร็วมาก และเรายังมีเวอร์ชันคู่ขนาน เบลค3 และใช้

$$token = \operatorname{BLAKE2}( publicKey \mathbin\| คีย์ส่วนตัว \mathbin\|expireTimestamp) \mathbin\| การประทับเวลาหมดอายุ $$ ปลอดภัย

NIST ยังได้กำหนดมาตรฐาน MAC สำหรับชื่อ SHA3 สจล( หรือ ที่นี่).

ทั้ง BLAKE2 และ KMAC ดีกว่า HMAC

หากคุณยืนยันที่จะใช้ SHA2 กับขนาดเอาต์พุต 256 บิต ให้ใช้ SHA-512/256 ซึ่งเป็นเวอร์ชันที่ถูกตัดทอนของ SHA-512/256 โดยมีค่าเริ่มต้นต่างกันเพื่อแยกโดเมน SHA-512/256 มีภูมิคุ้มกันต่อการโจมตีแบบขยายความยาว และออกแบบมาให้เป็นมิตรกับ CPU 64 บิต

AliReza Sabouri avatar
jp flag
ขอบคุณ @kelalaka สิ่งนี้ช่วยได้จริงๆ ตัวอย่างของคุณที่มี `ส่วนขยาย` สร้างคำถามใหม่ให้ฉัน จะทำอย่างไรถ้าทั้ง 3 ส่วนมีความยาวคงที่เสมอ เช่น (apikey=36, privateKey=44, expandTime=10) SHA256 มีความเสี่ยงในกรณีนี้หรือไม่ เนื่องจาก `expireTime` มีความยาวคงที่ จึงไม่มีใครสามารถเพิ่มส่วนขยายให้กับมันได้
kelalaka avatar
in flag
หากคุณทราบขนาดและตรวจสอบแล้ว จะไม่มีการโจมตีส่วนขยายอีกต่อไป ตราบใดที่ผู้โจมตีไม่หลอกล่อส่วนนั้นด้วย ฉันจะทำการโจมตีแบบขยายความยาวเพื่อรักษาความปลอดภัยเพื่อกำจัดพื้นผิวการโจมตี
kelalaka avatar
in flag
บันทึก; ฉันได้อัปเดตคำตอบเพื่อรวม SHA-512/256 ที่คุณอาจต้องการใช้

โพสต์คำตอบ

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