ประการแรกสิ่งนี้ไม่ได้ปรับปรุงความปลอดภัยของแอปพลิเคชันของคุณ (สมมติว่าเป็นเว็บแอป)
ใช้ SSL (หรือจริง ๆ แล้ว TLS ซึ่งโดยทั่วไปเรียกว่า SSL) ไม่แพงจริงๆ (วัดเวลาที่คุณใช้เพื่อค้นหาวิธีรอบ ๆ และคูณด้วยค่าแรงขั้นต่ำการซื้อใบรับรองจะชนะเกือบตลอดเวลา)
เหตุผลนี้เป็นเรื่องง่าย TLS ช่วยแก้ปัญหา (เมื่อใช้กับใบรับรองที่ซื้อแล้วไม่ได้ลงนามด้วยตนเอง) ซึ่งมีขนาดค่อนข้างใหญ่ในการเข้ารหัส: ฉันจะรู้ได้อย่างไรว่าเซิร์ฟเวอร์ที่ฉันกำลังพูดถึงคือเซิร์ฟเวอร์ที่ฉันคิดว่ากำลังคุยอยู่ ใบรับรอง TLS เป็นวิธีการพูดว่า: "ฉันซึ่งเป็นผู้ออกใบรับรองซึ่งได้รับความไว้วางใจจากเบราว์เซอร์ของคุณรับรองว่าเว็บไซต์ที่ [url] มีคีย์สาธารณะนี้พร้อมด้วยคีย์ส่วนตัวที่เกี่ยวข้องซึ่ง (คีย์ส่วนตัว) มีเพียงเซิร์ฟเวอร์เท่านั้นที่รู้ ฉันเซ็นลายเซ็นของฉันทั่วทั้งเอกสารหากใครแก้ไขลายเซ็นคุณสามารถดูได้ "
หากไม่มี TLS การเข้ารหัสใด ๆ ก็ไร้จุดหมายเพราะถ้าฉันนั่งข้างๆคุณในร้านกาแฟฉันสามารถทำให้แล็ปท็อป / สมาร์ทโฟนของคุณคิดว่าฉันเป็นเซิร์ฟเวอร์และ MiTM (Man in The Middle) คุณ ด้วย TLS แล็ปท็อป / สมาร์ทโฟนของคุณจะกรีดร้องว่า "UNTRUSTED CONNECTION" เพราะฉันไม่มีใบรับรองที่ลงนามโดยผู้ออกใบรับรองที่ตรงกับไซต์ของคุณ (การเข้ารหัสเทียบกับการพิสูจน์ตัวตน)
Disclaimer: ผู้ใช้มักจะคลิกขวาผ่านคำเตือนเหล่านี้: "การเชื่อมต่อที่ไม่น่าเชื่อถืออะไรนะฉันแค่อยากได้รูปลูกแมวของฉัน! เพิ่มข้อยกเว้น คลิก ยืนยัน คลิก YAY! ลูกแมว!"
อย่างไรก็ตามหากคุณไม่ต้องการซื้อใบรับรองจริงๆให้ใช้การแฮชจาวาสคริปต์ฝั่งไคลเอ็นต์ (และใช้ไลบรารีสแตนด์ฟอร์ด (SJCL) สำหรับสิ่งนั้นอย่าใช้CRYPTO ด้วยตัวคุณเอง )
ทำไม? ใช้รหัสผ่านซ้ำ! ฉันสามารถขโมยคุกกี้เซสชันของคุณ (ซึ่งทำให้ฉันสามารถแกล้งเซิร์ฟเวอร์ของคุณว่าฉันเป็นคุณ) โดยไม่ใช้ HTTPS ได้อย่างง่ายดาย (ดู firesheep) อย่างไรก็ตามหากคุณเพิ่มจาวาสคริปต์ในหน้าเข้าสู่ระบบของคุณซึ่งก่อนที่จะส่งให้แฮชรหัสผ่านของคุณ (ใช้ SHA256 หรือดีกว่านั้นให้ใช้ SHA256 ส่งคีย์สาธารณะที่คุณสร้างขึ้นจากนั้นเข้ารหัสแฮชรหัสผ่านด้วยสิ่งนั้นคุณจะไม่สามารถใช้เกลือได้ ด้วยสิ่งนี้) จากนั้นส่งรหัสผ่านที่แฮช / เข้ารหัสไปยังเซิร์ฟเวอร์ ล้างแฮชบนเซิร์ฟเวอร์ของคุณด้วยเกลือและเปรียบเทียบกับสิ่งที่เก็บไว้ในฐานข้อมูลของคุณ (เก็บรหัสผ่านดังนี้:
(SHA256(SHA256(password)+salt))
(บันทึกเกลือเป็นข้อความธรรมดาในฐานข้อมูลด้วย)) และส่งรหัสผ่านของคุณดังนี้:
RSA_With_Public_Key(SHA256(password))
และตรวจสอบรหัสผ่านของคุณดังนี้:
if SHA256(RSA_With_Private_Key(SHA256(sent_password))+salt_for_username) == stored_pass: login = ok
เนื่องจากหากมีคนแอบดมไคลเอ็นต์ของคุณพวกเขาจะสามารถล็อกอินเป็นไคลเอนต์ของคุณได้ (การไฮแจ็คเซสชัน) แต่พวกเขาจะไม่เห็นรหัสผ่านข้อความธรรมดา (เว้นแต่พวกเขาจะแก้ไขจาวาสคริปต์ของคุณอย่างไรก็ตามแฮ็กเกอร์สตาร์บัคส์อาจไม่ทราบวิธีการ / สนใจ ในสิ่งนี้) ดังนั้นพวกเขาจะสามารถเข้าถึงเว็บแอพของคุณได้ แต่ไม่สามารถเข้าถึงอีเมล / facebook / etc ของพวกเขาได้ (ซึ่งผู้ใช้ของคุณน่าจะใช้รหัสผ่านเดียวกัน) (ที่อยู่อีเมลอาจเป็นชื่อล็อกอินของพวกเขาหรือจะพบในโปรไฟล์ / การตั้งค่าบนเว็บแอพของคุณ)