โปรแกรมเมอร์เว็บควรรู้อะไรบ้างเกี่ยวกับการเข้ารหัส? [ปิด]


27

โปรแกรมเมอร์ที่สร้างเว็บไซต์ / เว็บแอปพลิเคชันควรเข้าใจการเข้ารหัสหรือไม่ ฉันไม่รู้ว่าอัลกอริทึม crypographic ส่วนใหญ่ทำงานอย่างไรและฉันไม่เข้าใจความแตกต่างระหว่าง md5 / des / aes / etc คุณเคยพบว่าจำเป็นต้องมีความเข้าใจเชิงลึกของการเข้ารหัสหรือไม่

ฉันไม่ต้องการมัน แต่ฉันสงสัยว่าบางทีฉันอาจขาดอะไร ฉันใช้แฮช salt + md5 เพื่อเข้ารหัสรหัสผ่านและบอกให้ผู้ให้บริการเว็บใช้ SSL นอกเหนือจากนั้นฉันไม่สามารถพูดได้ว่าฉันใช้อะไรมากและฉันไม่สามารถพูดด้วยความมั่นใจว่าวิธีการเหล่านี้ปลอดภัยเพียงใด ฉันใช้มันเพราะคนอื่นอ้างว่าปลอดภัย

คุณเคยพบว่าจำเป็นต้องใช้วิทยาการเข้ารหัสลับในการเขียนโปรแกรมเว็บนอกเหนือจากตัวอย่างง่ายๆสองอย่างนี้หรือไม่?


4
พวกเขาควรรู้พอที่จะรู้ว่าพวกเขาไม่ควรทำ
Slaks

@SLaks: +1 เห็นด้วย 100% ฉันเขียนคำตอบของหัวข้อนี้เพื่อขยายว่าทำไมสิ่งนี้
Chris Jester-Young

คำตอบ:


41

โปรแกรมเมอร์เว็บควรรู้ว่าพวกเขาไม่ควรลองใช้การเข้ารหัสด้วยตนเอง

โดยเฉพาะอย่างยิ่งนั่นหมายความว่าไม่มีผู้เชี่ยวชาญด้านความปลอดภัยที่ไม่ควรสัมผัสกับการเข้ารหัสแบบดั้งเดิมใด ๆ โดยตรง พวกเขาไม่ควรคิดในระดับของ AES, SHA-1 ฯลฯ แต่พวกเขาควรใช้ฟังก์ชั่นระดับสูงเพื่อเข้ารหัสและลงนามข้อความและรหัสผ่าน "แฮช"

ทำไม? เพราะมิฉะนั้นคนเข้าใจผิดคิดว่า:

  • AES-256 คือ "การเข้ารหัสที่ยอดเยี่ยม" แม้ว่าจะใช้งานจริงในโหมด ECB หรือใช้ค่า IV ที่ไม่ได้สุ่มเป็นต้น (ในบางโหมด IV ที่ไม่ใช่แบบสุ่ม แต่ไม่ซ้ำกันนั้นใช้ได้ในคนอื่น ๆ ไม่ใช่ มากมาย.)
  • พวกเขาสามารถใช้คีย์ symmetric เดียวกันสำหรับการเข้ารหัสข้อความหลาย ๆ ข้อความ (หรือแย่กว่านั้นคือเก็บคีย์ symmetric ในรหัสเพื่อใช้โดยตรง)
    • พวกเขาอาจตัดสินใจใช้ข้อความรหัสผ่านเป็นคีย์โดยตรงโดยไม่ต้องใช้ฟังก์ชั่นการรับรหัส
  • พวกเขาสามารถใช้ RSA เพื่อเข้ารหัสข้อมูลโดยตรง
  • พวกเขาสามารถ "เกลือและ MD5" รหัสผ่านของพวกเขาเพื่อให้พวกเขาปลอดภัย (ถ้าคุณคิดว่าตารางสายรุ้งเป็นลิงค์ที่อ่อนแอที่สุดให้คิดอีกครั้ง )

เพียงเพื่อจะอยู่ในหน้าเดียวกันไม่มีรายการข้างต้นจะถูก หากคุณไม่ได้รับสิ่งนั้นคุณไม่ควรสัมผัส crypto กับเสาขนาด 10 ฟุต! (AES-256 เป็นการเข้ารหัสที่ยอดเยี่ยม แต่ถ้าคุณใช้อย่างถูกต้อง "ไม่ใช่ขนาดที่สำคัญมันเป็นสิ่งที่คุณทำกับมัน" :-))

ฉันกำลังพูดถึงฟังก์ชั่นระดับสูงอะไร ฉันเองแนะนำให้ใช้ไลบรารี OpenPGP (สำหรับข้อมูลที่เหลือ) หรือ SSL (สำหรับ data in motion) โปรโตคอลเหล่านี้ระบุการใช้อัลกอริทึมแบบไม่สมมาตรสมมาตรและแฮชอย่างถูกต้อง ตัวอย่างเช่นด้วย OpenPGP:

  • มันไม่ได้ใช้ RSA ในการเข้ารหัสข้อมูลโดยตรง แต่จะสร้างคีย์แบบสุ่ม (สมมาตร) ต่อข้อความ (นี่เป็นสิ่งสำคัญ) และใช้ RSA เพื่อเข้ารหัสคีย์เซสชันนั้น
  • มันใช้ฟังก์ชั่นที่ได้รับกุญแจเพื่อแปลงวลีรหัสผ่านเป็นกุญแจ (ในสำนวน OpenPGP เรียกว่า S2K แต่ฉันคิดว่า "ฟังก์ชั่นการสืบทอดที่สำคัญ" เป็นคำมาตรฐานมากขึ้น)
  • มันจัดการการเลือกโหมดที่ดีดังนั้นคุณจะไม่จบลงด้วยการใช้ ECB
  • มันจัดการการจัดการที่สำคัญสำหรับคุณดังนั้นคุณไม่จำเป็นต้องตัดสินใจเกี่ยวกับคีย์ที่เชื่อถือได้ ฯลฯ

สรุป: ถ้าคุณไม่ได้เป็นผู้เชี่ยวชาญด้านการรักษาความปลอดภัยและคุณความคิดอยู่ที่ระดับของ AES หรือ SHA-1 หรือ (ห้ามสวรรค์) MD5 ที่คุณกำลังทำมันผิด ใช้ไลบรารีที่เขียนโดยผู้เชี่ยวชาญด้านความปลอดภัย (เช่น Bouncy Castle) ที่ใช้โปรโตคอลที่ออกแบบโดยผู้เชี่ยวชาญด้านความปลอดภัย (เช่น OpenPGP สำหรับการเข้ารหัสหรือ bcrypt หรือ scrypt สำหรับการแฮ็กรหัสผ่าน)

ฉันไม่ใช่ผู้เชี่ยวชาญการเข้ารหัสด้วยวิธีใด ๆ แต่ฉันรู้ดีพอที่จะไม่ออกแบบโปรโตคอล ad-hoc ของฉันเอง เพียงเพื่อจะชัดเจน, โพสต์ทั้งหมดเป็นวัสดุการเข้ารหัส 101 ดังนั้นหากโพสต์นี้ไม่เหมาะกับคุณ 100% คุณก็ไม่ควรเข้าใกล้การเข้ารหัส


4
น่ากลัว ชอบโพสต์บล็อกที่เชื่อมโยงกับ "คิดอีกครั้ง" chargen.matasano.com/chargen/2007/9/7/…
davidhaskins

+1 แต่การใช้คีย์สมมาตรเดียวกันหลายครั้งนั้นใช้ได้ นั่นคือสิ่งที่ IV ใช้ (ไม่เช่นนั้นคุณไม่จำเป็นต้องใช้)
orip

1
นอกจากนี้ Colin Percival จากชื่อเสียงของ scrypt (และอื่น ๆ ) มีบทความที่ยอดเยี่ยมที่เรียกว่า "คำตอบที่ถูกต้องสำหรับการเข้ารหัสลับ" ซึ่งแสดงถึงการตัดสินใจเกี่ยวกับการเข้ารหัสลับแบบขนมปังและเนยที่คุณต้องทำ SSL เป็นปัญหาอย่างมาก (การเพิกถอนคีย์ทำได้ยากมาก) ข้อมูลเพิ่มเติมที่นี่: daemonology.net/blog/…
orip

@orip เห็นด้วยแม้ว่าฉันจะบอกว่าการใช้คีย์เดียวกันกับ IV อื่นมักจะมีประโยชน์มากกว่าสำหรับกรณีที่ข้อความของคุณยาวกว่าขนาดบล็อกของ symmetric cipher ที่คุณเลือกแทนที่จะเป็นข้อความที่แตกต่างกันโดยที่คุณไม่มี บริบทสำหรับการติดตาม IV ที่ใช้สำหรับข้อความก่อนหน้า เห็นด้วยกับบทความของ Colin Percival
Chris Jester-Young

1
@ สนุกฉันได้เปลี่ยนลิงก์ไปยังบางสิ่งที่มีความเกี่ยวข้องมากกว่า
Chris Jester-Young

14

คุณไม่จำเป็นต้องรู้อะไรนอกจากพื้นฐานเกี่ยวกับการเข้ารหัส (สิ่งที่แฮช, เกลือ, ประมาณว่ายากที่จะถอดรหัสการเข้ารหัสนี้หรืออื่น ๆ ) แต่คุณต้องรู้เรื่องความปลอดภัยใน ทั่วไป.

พื้นที่รักษาความปลอดภัยหลักที่คุณต้องระวังในฐานะผู้พัฒนาเว็บ:

  1. การฉีด SQL นี่อาจเป็นหลุมเดียวที่อันตรายที่สุดที่นักพัฒนาเว็บสามารถเจาะระบบได้
  2. การเขียนสคริปต์ข้ามไซต์และคุกกี้
  3. สแปมบอทและแคปชา
  4. การฉีด SQL ไม่สามารถเน้นได้เพียงพอว่ามีความสำคัญเพียงใด

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

@ user1525 นั่นคือสิ่งที่ฉันหมายถึงเป็นพื้นฐานของการเข้ารหัส แน่นอนว่าคุณไม่จำเป็นต้องรู้ว่าอัลกอริธึมการเข้ารหัสแบบใดที่ใช้งานได้จริง
biziclop

ฉันขอขอบคุณการตอบสนองและฉันเห็นด้วยกับการฉีด SQL และการโจมตีอื่น ๆ แต่ฉันถามเกี่ยวกับการเข้ารหัส
davidhaskins

2
@davidhaskins ใช่ฉันแค่คิดว่ามันคุ้มค่าที่จะชี้ให้เห็นเพราะแต่ละระดับสร้างก่อนหน้านี้ การรู้ว่า AES ทำงานอย่างไรไม่มีค่าอะไรถ้าคุณล้มเหลวในการรักษาความปลอดภัยแอปพลิเคชันของคุณในระดับพื้นฐานมากขึ้น จากประสบการณ์ของฉันนี่คือกับดักนักพัฒนาหลายคนตกอยู่ใน (ฉันทำมันหลายครั้ง) เพื่อมุ่งเน้นการเข้ารหัสและมองไม่เห็นบทบาทของมันในสายการรักษาความปลอดภัยที่ยาวนาน
biziclop

4

ฉันจำได้ว่าเคยเห็นการพูดคุยนี้ว่าสิ่งที่วิศวกรทุกคนจำเป็นต้องรู้เกี่ยวกับความปลอดภัยและสถานที่เรียนรู้ผู้พูดคือ Neil Daswani และเป็นการพูดคุยทางเทคนิคของ Google ที่เขาให้อาจเป็นจุดเริ่มต้นที่ดี!

แม้ว่าจะไม่ได้ใช้กับโปรแกรมเมอร์เว็บเท่านั้นบางทีคำถามควรตั้งชื่อใหม่ว่า "โปรแกรมเมอร์ควรรู้อะไรบ้างเกี่ยวกับความปลอดภัย" เนื่องจากพวกเขาไม่จำเป็นต้องรู้มากกว่าพื้นฐานเกี่ยวกับการเข้ารหัส (น่าสนใจเท่าที่เป็น)


2

Crypto มีประโยชน์ในหลาย ๆ สถานการณ์ ตัวอย่างที่เราใช้คือการเข้ารหัสคุกกี้เซสชันที่สร้างและตั้งค่าโดยโฮสต์ Win / IIS ที่จะใช้กับโฮสต์ LAMP

หากคุณต้องใช้การเข้ารหัส (ซึ่งตรงกันข้ามกับ md5 / sha1 hashing) คำพื้นฐานบางอย่างมีความสำคัญเช่นความแตกต่างระหว่างการเข้ารหัสแบบสมมาตรและแบบไม่สมมาตร นอกเหนือจากการทำความเข้าใจกับความแตกต่างระหว่างสองอย่างนี้แล้วคุณควรพัฒนาความเข้าใจในสิ่งที่คุณเป็นนักพัฒนาเว็บต้องทำเพื่อจัดเก็บและถอดรหัสคีย์อย่างปลอดภัย ตัวอย่างเช่นหากการพัฒนาแอปพลิเคชันที่จะนำไปใช้งานบนโฮสต์ที่คุณไม่มีการควบคุมดูแลเต็มรูปแบบเช่นโฮสต์ที่ใช้ร่วมกันกับการปรับใช้บนเซิร์ฟเวอร์ที่ผู้ดูแลระบบทั้งหมดรู้จักและเชื่อถือได้


2

ในความคิดของฉันคุณควรรู้ทุกอย่างเกี่ยวกับการเข้ารหัสที่มีคนโจมตีรหัสของคุณจะรู้ คุณควรเข้าใจแฮชเกลือความไม่สุ่มของอัลกอริธึมการเข้ารหัสที่สำคัญ (RSA, 3DES, AES ฯลฯ ), SHA-1 / MD-5 / et al คุณไม่จำเป็นต้องจดจำพวกเขา แต่อย่างน้อยคุณควรรู้ว่าประสิทธิภาพของอัลกอริธึมแฮชและวิธีทำให้แข็งแกร่งขึ้น คุณควรรู้ว่าการชนและผลบวกที่ผิดคืออะไร คุณไม่ควรท่องอัลกอริธึมการเข้ารหัส แต่คุณควรคุ้นเคยกับการวัดประสิทธิภาพของมัน คุณควรจะสามารถอธิบายและอธิบายการเข้ารหัสแบบสมมาตรและแบบไม่สมมาตรและใช้เมื่อใด คุณควรรู้ว่า PKI คืออะไรและใช้อย่างไร คุณควรรู้ว่าผู้ออกใบรับรองคืออะไรและมีการโต้ตอบกับเซิร์ฟเวอร์ของคุณอย่างไร

การรู้ถึงสิ่งที่ลึกล้ำของทุกสิ่งไม่สำคัญเท่ากับการรู้พื้นหลังของมัน อะไรคือมาตรฐานของบางสิ่ง (เร็วแค่ไหนความแข็งแกร่งความอ่อนแอ ฯลฯ )

คำแนะนำเหล่านี้สำหรับข้อมูลระดับอาวุโสหรือสถาปนิก หากคุณเป็นเพียงลิงลิงพายเรือคุณไม่จำเป็นต้องรู้อะไรเลย สถาปนิกของคุณควรรู้สิ่งนี้ หากคุณเป็นผู้ดูแลเว็บไซต์ออกแบบออกแบบติดตั้ง ฯลฯ คุณควรคุ้นเคยกับแนวคิดเหล่านี้ทั้งหมดและสามารถพูดคุยกับพวกเขาได้อย่างชาญฉลาด คุณไม่จำเป็นต้องสอนเพียงแค่ยอมรับและเผยแพร่ข้อมูลเกี่ยวกับมัน


2

คุณควรใช้bcrypt (Blowfish) เพื่อจัดเก็บรหัสผ่านแทนที่จะเป็น MD5 มันเป็นอัลกอริธึมที่ช้ากว่ามากซึ่งหมายความว่ามันเป็นเรื่องยากสำหรับแฮกเกอร์ที่จะคาดเดาและตรวจ นอกจากนี้ bcrypt ยังใช้ปัจจัยการทำงานเป็นพารามิเตอร์ซึ่งหมายความว่ามันจะช้าลงเมื่อมีการเปิดตัวคอมพิวเตอร์ใหม่ดังนั้นจึงมีการพิสูจน์ในตัวในอนาคต

ดูวิธีการเก็บรหัสผ่านอย่างปลอดภัยสำหรับข้อมูลเพิ่มเติม


0

เป็นคำตอบทั่วไปสำหรับคำถามประเภทนี้ฉันคิดเสมอว่าคุณควรพยายามทำความเข้าใจพื้นฐานของสิ่งใดก็ตามที่เกี่ยวข้องกับสิ่งที่คุณทำจากระยะไกล แน่นอนคุณต้องมีความรู้อย่างละเอียดเกี่ยวกับสิ่งที่คุณกำลังทำอยู่ มันยากมากที่จะคาดการณ์ว่าจะมีการพัฒนาในด้านใดสิ่งที่จะเป็น "แฟชั่น" หรือสิ่งที่คุณต้องการในอนาคตดังนั้นการมีสิ่งต่าง ๆ มากมายที่คุณมีอย่างน้อย "ได้ยิน" จะเก็บไว้ เปิดประตูหลายบาน

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.