Score:0

AES 256bitkey ที่สร้างจาก PBKDF2 มีความปลอดภัยเพียงใด

ธง cn

ฉันใช้การเข้ารหัส CryptoJS AES 256:

CryptoJS.AES.encrypt(realData, createKey(รหัสผ่าน), {iv: iv});

ความลับถูกสร้างขึ้นโดย:

ฟังก์ชัน createKey (วลีรหัสผ่าน) {
  const เกลือ = CryptoJS.lib.WordArray.random(128/8);
  const key256Bits = CryptoJS.PBKDF2(ข้อความรหัสผ่าน, เกลือ, {
    ขนาดคีย์: 256 / 32,
    การทำซ้ำ: หมายเลขสุ่ม,
  });

  ส่งคืนคีย์ 256Bits;
}

ฉันยังใหม่กับสิ่งนี้และสงสัยว่า 256keybits ข้างต้นปลอดภัยแค่ไหน

ใครสามารถใช้กำลังดุร้ายเพื่อค้นหาสตริงการเข้ารหัส hex, base64 ของ 256keybits, iv โดยไม่สนใจวลีรหัสผ่าน

จากนั้นแปลง 256keybits จริง iv ซึ่งใช้ในการถอดรหัสข้อมูลจริงในการเข้ารหัส AES หรือ 256keybits สามารถดุร้าย?

ขอบคุณ!

Score:1
ธง ng

ค่าสำหรับ การวนซ้ำ: หมายเลขสุ่ม ไม่ควรเป็นตัวเลขสุ่ม เป็นจำนวนการวนซ้ำที่ควบคุมต้นทุนของ PBKDF2 ควรตั้งค่าให้สูงที่สุดเท่าที่จะยอมรับได้ในแอปพลิเคชัน และการป้องกันที่ PBKDF2 จัดหาให้ต่อการค้นหารหัสผ่านจะเพิ่มขึ้นเป็นเส้นตรงด้วยพารามิเตอร์นั้น ในต่อไปนี้ฉันถือว่าสูง การทำซ้ำ (พูดพื้นฐานหลักแสน) และนั่น เกลือ ได้รับการจัดเก็บไม่ทางใดก็ทางหนึ่ง ฉันคิดว่ามันใช้ HMAC-SHA-1 (ค่าเริ่มต้น) หรือ HMAC-SHA-256 (ทั่วไปด้วย)

เท่าที่เราทราบ จุดอ่อนหลักในสิ่งที่อธิบายไว้คือสามารถทดสอบวลีรหัสผ่านได้โดยการเรียกใช้ createKey จากนั้นจึงทดสอบคีย์ที่เกี่ยวข้องโดยใช้ AES cryptogram ที่รู้จัก คือว่า "โดยไม่สนใจข้อความรหัสผ่าน"? ที่ไม่ชัดเจนสำหรับฉัน

ปัญหาคือ PBKDF2 สามารถทำงานด้วยความเร็วสูงมากโดยผู้โจมตีโดยใช้ GPU, FPGA หรือ ASIC เมื่อไร การทำซ้ำ สูง (ตามที่ควร) PBKDF2 เป็นคอขวดของ สร้างคีย์ และการค้นหารหัสผ่าน ดังนั้นผู้ไม่หวังดีสามารถค้นหาลำดับความสำคัญรหัสผ่านได้เร็วกว่าผู้ใช้ปกติโดยใช้ CryptoJS จากมุมมองของการทำให้การค้นหารหัสผ่านเป็นเรื่องยาก ซึ่งเป็นเป้าหมายหลักในคำถาม PBKDF2 จึงเป็นหนึ่งในการใช้พลังงาน CPU สำรองที่แย่ที่สุดเท่าที่จะเป็นไปได้สำหรับ การยืดที่สำคัญ เมื่อพูดถึงศัตรูที่ทรงพลัง ตัวเลือกที่ดีกว่ามาก ar Argon2, scrypt หรือแม้แต่ bcrypt

คุณตัดสินใจว่าเป็นเรื่องบังเอิญที่ NIST เดิมแนะนำ PBKDF2, และ ยังไม่บังคับใช้สิ่งที่ดีกว่า; เหมือนเคยผลักไส Dual_EC_DRBGด้วยความตั้งใจที่ชัดเจนในการอนุญาตให้หน่วยข่าวกรองของสหรัฐฯ ทำลายการเข้ารหัสลับนี้ อาจใช้มีดโกนของ Hanlon แต่ฉันนับถือนักวิทยาศาสตร์ของ NIST สูงกว่า

Kim Mỹ avatar
cn flag
"โดยไม่สนใจข้อความรหัสผ่าน"? ฉันหมายถึงเฟสรหัสผ่านที่ส่งผ่านไปยัง createKey (ข้อความรหัสผ่าน) อาจมีอักขระพิเศษเพื่อให้แข็งแกร่งสำหรับการดุร้าย ในขณะที่คีย์ส่งคืนจาก createKey (ข้อความรหัสผ่าน) ซึ่งฉันสามารถใช้เพื่อเข้ารหัสและถอดรหัสข้อมูลจริงใน CryptoJS.AES.encrypt (realData, createKey (ข้อความรหัสผ่าน), {iv: iv}) เป็นอาร์เรย์ของไบต์ เนื่องจากไบต์เป็นเรื่องใหม่สำหรับฉัน ดังนั้นฉันจึงไม่รู้ว่ามันยากต่อการดุร้ายและนำกลับไปสู่การถอดรหัสเป็นคีย์หรือไม่
Kim Mỹ avatar
cn flag
นอกจากนี้สตริงการเข้ารหัสที่อ่านได้ (Hex, Base64) ของ createKey (ข้อความรหัสผ่าน) (ซึ่งใน Crypto-JS ฉันสามารถใช้ key256Bits.toString()) ไม่มีอักขระพิเศษใด ๆ หากฐานสิบหกหรือเฉพาะ '/,+' และ wierd ลงท้ายด้วย ' ==' ถ้า base64. และนั่นเป็นเรื่องง่ายสำหรับการบังคับเดรัจฉานจากนั้นแปลงกลับเป็นอาร์เรย์ของไบต์ (คีย์ที่ส่งคืนจาก createKey (วลีรหัสผ่าน)) จากนั้นใส่ในการถอดรหัส realData? ขออภัยนี่เป็นเรื่องใหม่สำหรับฉันและแก้ไขฉันหากฉันผิด ขอบคุณ!
Kim Mỹ avatar
cn flag
ในไลบรารี Crypto-JS ให้สตริงการเข้ารหัสที่อ่านได้ (Hex, Base64) ของ createKey (วลีรหัสผ่าน) ฉันสามารถใช้ CryptoJS.enc.Hex.parse() เพื่อรับ 256keybits จริงและถอดรหัส realData โดยไม่สนใจวลีรหัสผ่าน ส่งผ่านไปยัง createKey (วลีรหัสผ่าน) เพื่อสร้างคีย์ถอดรหัส?
fgrieu avatar
ng flag
ไม่ง่ายกว่าที่จะบังคับให้คีย์ 256 บิตที่แสดงเป็นสตริง Base64 43 อักขระง่ายกว่าการบังคับให้ดุร้ายเทียบเท่าดิบ 32 ไบต์ และนั่นเป็นไปไม่ได้เลย การเข้ารหัสเอาต์พุตของ PBKDF2 อย่างถูกต้องเพื่อสร้างคีย์ AES ที่มีขนาด 256 บิตทั้งหมดเป็นรายละเอียดที่สำคัญ ฉันคิดว่ามันไม่ถูกต้อง นั่นเป็นปัญหาในการเขียนโปรแกรมซึ่งขึ้นอยู่กับ CryptoJS อย่างมาก ดังนั้นจึงค่อนข้างนอกหัวข้อ ฉันไม่ได้หารือเกี่ยวกับเรื่องนี้
dave_thompson_085 avatar
cn flag
(@KimMỹ+) crypto-js.PBKDF2 ส่งคืน _WordArray_ ซึ่งเป็นประเภท 'อ็อบเจกต์' ของจาวาสคริปต์ที่ _contains_ ไบต์ (แต่ไม่ใช่ เช่น ในตัวของ Unit8Array ของจาวาสคริปต์); หากคุณแปลงเป็นสตริง (เช่นโดย console.log) ผลลัพธ์นั้นเข้ารหัสใน base64 แต่ถ้าคุณส่งผ่านเป็นคีย์ไปยังอินสแตนซ์ crypto-js.Cipher ที่ใช้ไบต์ในนั้น ในขณะที่ถ้าคุณส่ง (ในตัว) _string_ ไปยังอินสแตนซ์ดังกล่าว จะใช้ PBKDF ที่กำหนดโดย OpenSSL และค่อนข้างแย่ (EVP_BytesToKey with niter=1) และโดยค่าเริ่มต้นจะใช้รูปแบบที่กำหนดโดย OpenSSL โดยมี `Salted__`+8bytes ต่อท้ายข้อความเข้ารหัสและเข้ารหัสใน base64

โพสต์คำตอบ

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