ที่เก็บข้อมูลในตัวเครื่องปลอดภัยหรือไม่? [ปิด]


161

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

ฉันยอมรับว่านี่ไม่ใช่วิธีปฏิบัติที่แนะนำ แต่มีตัวเลือกเล็กน้อยที่ฉันทำต่อไปนี้เพื่อรักษาความปลอดภัยข้อมูล:

  • การเข้ารหัสทุกอย่างที่อยู่ในที่จัดเก็บในตัวเครื่องโดยใช้ไลบรารี stanford javascript crypto และ AES-256
  • รหัสผ่านผู้ใช้เป็นรหัสการเข้ารหัสและไม่ได้เก็บไว้ในอุปกรณ์
  • ให้บริการเนื้อหาทั้งหมด (เมื่อออนไลน์) จากเซิร์ฟเวอร์ที่เชื่อถือได้เดียวผ่าน ssl
  • การตรวจสอบความถูกต้องของข้อมูลทั้งหมดที่ไปและกลับจากที่จัดเก็บในตัวเครื่องบนเซิร์ฟเวอร์โดยใช้โครงการ antaspam ของ owasp
  • ในส่วนเครือข่ายของ appcache ไม่ใช่ใช้ * และแสดงรายการเฉพาะ URIs ที่จำเป็นสำหรับการเชื่อมต่อกับเซิร์ฟเวอร์ที่เชื่อถือได้แทน
  • โดยทั่วไปแล้วพยายามใช้แนวทางที่แนะนำในแผ่นโกง OWASP XSS

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

  • ข้อบกพร่องพื้นฐานในแนวทางข้างต้น?
  • วิธีแก้ปัญหาที่เป็นไปได้สำหรับข้อบกพร่องดังกล่าว?
  • มีวิธีใดที่ดีกว่าในการรักษาความปลอดภัยที่จัดเก็บในตัวเครื่องเมื่อแอปพลิเคชัน html 5 ต้องทำงานแบบออฟไลน์เป็นเวลานาน

ขอบคุณสำหรับความช่วยเหลือใด ๆ


"ฉันยอมรับว่านี่ไม่ใช่การฝึกฝนที่แนะนำ" - ใช่ไหม? ไม่ตรงข้ามกับที่สร้างขึ้นจริงหรือ
hakre

2
เพื่อความกระจ่างแจ้งฉันไม่ได้แนะนำวิธีปฏิบัติในการจัดเก็บข้อมูลที่สำคัญในที่จัดเก็บในตัวเครื่อง
user1173706

เช่นที่คุณไม่ควรส่งข้อมูลที่ละเอียดอ่อนผ่านเครือข่ายขนาดใหญ่?
hakre

@ user1173706 เหตุใดแอปพลิเคชันจึงต้องทำงานจึงต้องทำงานเป็นระยะเวลานานแบบออฟไลน์ ผู้ใช้มีลักษณะอย่างไร เบราว์เซอร์ใดที่คุณต้องสนับสนุน ฉันคิดว่ามันเป็นไปได้ แต่ฉันจำเป็นต้องรู้เฉพาะเกี่ยวกับสถานการณ์ของคุณ
Benjamin Gruenbaum

@Benjamin ฉันได้อัปเดตคำถามแล้ว ขอบคุณ
1173706

คำตอบ:


74

WebCrypto

ข้อกังวลเกี่ยวกับการเข้ารหัสในจาวาสคริปต์ด้านลูกค้า (เบราว์เซอร์) มีรายละเอียดด้านล่าง แต่ทุกคนกังวลเหล่านี้ไม่ได้นำไปใช้กับAPI WebCryptoซึ่งขณะนี้ได้รับการสนับสนุนด้วยดี

สำหรับแอปออฟไลน์คุณยังคงต้องออกแบบและติดตั้งที่เก็บคีย์ที่ปลอดภัย

นอกเหนือจาก: หากคุณใช้ Node.js ให้ใช้ builtin crypto API

การเข้ารหัสแบบ Native-Javascript (pre-WebCrypto)

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

หากใครบางคนมีการเข้าถึงทางกายภาพคุณจะเปิดการโจมตีอื่น ๆ และแย่กว่าการอ่าน สิ่งเหล่านี้รวมถึง (แต่ไม่ จำกัด เพียง): keyloggers, การแก้ไขสคริปต์ออฟไลน์, การฉีดสคริปต์ในเครื่อง, การวางยาพิษในแคชของเบราว์เซอร์และการเปลี่ยนเส้นทาง DNS การโจมตีเหล่านั้นจะใช้งานได้ก็ต่อเมื่อผู้ใช้ใช้เครื่องหลังจากที่ถูกโจมตี อย่างไรก็ตามการเข้าถึงทางกายภาพในสถานการณ์ดังกล่าวหมายความว่าคุณมีปัญหามากขึ้น

ดังนั้นโปรดจำไว้ว่าสถานการณ์ที่มีข้อ จำกัด ซึ่งการเข้ารหัสลับในตัวเครื่องนั้นมีค่าหากเครื่องถูกขโมย

มีห้องสมุดที่ไม่ใช้ฟังก์ชั่นที่ต้องการเช่นมีสแตนฟอ Javascript Crypto ห้องสมุด มีจุดอ่อนโดยธรรมชาติแม้ว่า (ตามที่อ้างถึงในลิงก์จากคำตอบของ @ ircmaxell):

  1. ไม่มีการสร้างเอนโทรปี / หมายเลขสุ่ม
  2. ไม่มีที่เก็บคีย์ที่ปลอดภัยเช่นไพรเวตคีย์ต้องได้รับการป้องกันด้วยรหัสผ่านหากเก็บไว้ในเครื่องหรือจัดเก็บไว้บนเซิร์ฟเวอร์
  3. ขาดความปลอดภัยลบ
  4. ขาดลักษณะเวลา

แต่ละจุดอ่อนเหล่านี้สอดคล้องกับหมวดหมู่ของการประนีประนอมการเข้ารหัสลับ ในคำอื่น ๆ ในขณะที่คุณอาจมี "crypto" ตามชื่อมันจะต่ำกว่าความรุนแรงหนึ่งที่ต้องการในการปฏิบัติ

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

🔥หากคุณอ่านย่อหน้าสุดท้ายและคิดว่า "ผู้ชายบางคนบนอินเทอร์เน็ตชื่อ Brian บอกว่าฉันสามารถใช้ Javascript crypto" ได้โปรดอย่าใช้ Javascript crypto

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


มีเอกสารเพิ่มเติม (การอ้างอิง) ที่มีให้สำหรับท่าทางทั่วไปของ "อย่าใช้ JavaScript crypto" ที่จัดทำโดยกลุ่ม NCC จาก 2011: การเข้ารหัส JavaScript พิจารณาว่าเป็นอันตราย (โดยเฉพาะอย่างยิ่งเนื่องจาก catch-22 ของการดาวน์โหลดเครื่องมือเพื่อตรวจสอบการดาวน์โหลด ... … ฯลฯ )
รวบรวม

58

หลักฐานพื้นฐานที่นี่ก็คือ: ไม่มันยังไม่ปลอดภัย

โดยทั่วไปคุณไม่สามารถเรียกใช้การเข้ารหัสลับใน JavaScript: JavaScript Crypto พิจารณาอันตราย

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

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

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


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

9
@ircmaxell ไม่ใช่ฉัน แต่ฉันไม่เห็นด้วยกับคำตอบนี้ "ปัญหาคือคุณไม่สามารถรับรหัส crypto ในเบราว์เซอร์ได้อย่างน่าเชื่อถือและแม้ว่าคุณจะทำได้ JS ไม่ได้ออกแบบมาเพื่อให้คุณทำงานได้อย่างปลอดภัย" - ทำไม อะไรคือธรรมชาติปัญหา? คุณสามารถใช้ไลบรารีการเข้ารหัสของ Stanford JavaScript และทำการเข้ารหัส / ถอดรหัสได้ คุณสามารถแฮชและคุณสามารถทำทุกอย่างได้อย่างปลอดภัย ฉันไม่เห็นปัญหาโดยธรรมชาติที่นี่ในแอปออฟไลน์ใน JS ที่ทำ crpyto มาตรฐานเหมือนกับแอปที่สร้างขึ้นในภาษาอื่น
Benjamin Gruenbaum

11
@BenjaminGruenbaum: ปัญหาคือมีหลายสถานที่ที่ crypto-code จะต้องโต้ตอบกับรหัสบุคคลที่สาม จุดรวมของบทความที่ฉันเชื่อมโยงกับคือคุณไม่สามารถควบคุมสภาพแวดล้อมการดำเนินการ ดังนั้นคุณจึงติดตั้ง Stanford Crypto lib ถ้าเป็นเช่นนั้นจะเกิดอะไรขึ้นถ้าปลั๊กอินของเบราว์เซอร์บางตัวเขียนทับรหัสsjcl.encryptอีเมลของผู้โจมตี ใน JS นั้นเป็นไปได้ 100% และไม่มีอะไรที่คุณสามารถทำได้เพื่อหยุดมัน และนั่นคือจุดเริ่มต้น ไม่มีกลไก "ความปลอดภัย" ในการป้องกัน JS อื่น ๆ จากการทำสิ่งที่น่ารังเกียจให้กับข้อมูลของคุณ และที่เป็นปัญหา
ircmaxell

13
@ircmaxell หากคุณนอนกับสุนัขคุณไม่สามารถคาดหวังว่าจะไม่ตื่นขึ้นมาด้วยหมัด หากผู้ใช้ติดตั้งมัลแวร์ที่เพิ่มในนั้นเป็นเช่นเดียวกับผู้ใช้ที่ติดตั้งไวรัสบนพีซีของพวกเขาก็ไม่ต่างจากมัน โปรแกรม Java หรือ C ของคุณมีความปลอดภัยเท่าที่ได้รับ แต่ทันทีที่ผู้โจมตีมีความสามารถในการเรียกใช้โค้ดที่คุณเมา นั่นไม่ต่างกับ JS Addons ไม่เพียงปรากฏอย่างน่าอัศจรรย์ในเบราว์เซอร์ ยิ่งไปกว่านั้นการไม่บันทึกข้อมูลที่เข้ารหัสจะไม่ช่วย แต่อย่างใดหากผู้ใช้มีมัลแวร์เนื่องจากสามารถขโมยข้อมูลได้
Benjamin Gruenbaum

9
@BenjaminGruenbaum: ไม่เห็นด้วย ในโปรแกรมปกติคุณจะต้องอย่างใดอย่างหนึ่งที่จะประนีประนอม app ตัวเอง (อ่านตำแหน่งหน่วยความจำ) หรือการเข้าถึงรากกำไรกล่อง (ประนีประนอมระบบปฏิบัติการ) ไม่ว่าจะด้วยวิธีใดคุณต้องประนีประนอมบางสิ่งให้ลึกกว่าการทำพฤติกรรมปกติ JS อนุญาตสิ่งนี้ในพฤติกรรมปกติ ปัญหาไหน ...
ircmaxell

12

ในการสำรวจหัวข้อนี้ฉันมีการนำเสนอหัวข้อ "การรักษาความปลอดภัย TodoMVC โดยใช้ Web Cryptography API" ( วิดีโอ , รหัส )

โดยใช้Web Cryptography APIเพื่อจัดเก็บรายการสิ่งที่ต้องทำที่เข้ารหัสใน localStorage ด้วยรหัสผ่านเพื่อป้องกันแอปพลิเคชันและใช้รหัสที่ได้รับจากรหัสผ่านสำหรับการเข้ารหัส หากคุณลืมหรือทำรหัสผ่านหายจะไม่มีการกู้คืน ( ข้อจำกัดความรับผิดชอบ - เป็น POC และไม่ได้มีไว้สำหรับใช้ในการผลิต )

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

ในท้ายที่สุดการเข้ารหัส localStorage อาจปกป้องข้อมูลจากผู้โจมตีที่มีการเข้าถึงระบบหรือการสำรองข้อมูลแบบอ่านอย่างเดียวเท่านั้น มันเพิ่มการป้องกันจำนวนเล็กน้อยในเชิงลึกสำหรับ OWASP 10 รายการA6-Sensitive Data Exposureและช่วยให้คุณตอบ "ข้อมูลใด ๆ ที่เก็บไว้ในข้อความที่ชัดเจนในระยะยาวหรือไม่" ได้อย่างถูกต้อง


3

นี่เป็นบทความที่น่าสนใจจริงๆที่นี่ ฉันกำลังพิจารณาใช้การเข้ารหัส JS เพื่อเสนอความปลอดภัยเมื่อใช้ที่เก็บข้อมูลในเครื่อง เป็นที่ชัดเจนว่าจะให้ความคุ้มครองต่อเมื่ออุปกรณ์ถูกขโมย (และมีการใช้งานอย่างถูกต้อง) มันจะไม่ให้การป้องกัน keyloggers เป็นต้นอย่างไรก็ตามนี่ไม่ใช่ปัญหาของ JS เนื่องจากการคุกคามของ keylogger นั้นเป็นปัญหาของแอปพลิเคชันทั้งหมดโดยไม่คำนึงถึงแพลตฟอร์มการเรียกใช้ (เบราว์เซอร์ดั้งเดิม) สำหรับบทความ "JavaScript Crypto พิจารณาว่าเป็นอันตราย" อ้างอิงในคำตอบแรกฉันมีการวิจารณ์อย่างหนึ่ง มันระบุว่า "คุณสามารถใช้ SSL / TLS เพื่อแก้ปัญหานี้ แต่มีราคาแพงและซับซ้อน" ฉันคิดว่านี่เป็นข้อเรียกร้องที่ทะเยอทะยานมาก (และอาจมีอคติมากกว่า) ใช่ SSL มีค่าใช้จ่าย

บทสรุปของฉัน - มีสถานที่สำหรับรหัสการเข้ารหัสฝั่งไคลเอ็นต์อย่างไรก็ตามเช่นเดียวกับแอปพลิเคชันทั้งหมดที่นักพัฒนาต้องตระหนักถึงข้อ จำกัด และการใช้งานหากเหมาะสมกับความต้องการของพวกเขาและมั่นใจว่ามีวิธีการลดความเสี่ยง


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

2

ไม่สามารถเข้าถึงหน้าเว็บใด ๆ (จริง) แต่เข้าถึงได้ง่ายและแก้ไขได้ง่ายผ่านเครื่องมือ dev เช่น chrome (ctl-shift-J) ดังนั้นจำเป็นต้องเข้ารหัสลับแบบกำหนดเองก่อนที่จะเก็บค่า

แต่ถ้าจาวาสคริปต์จำเป็นต้องถอดรหัส (เพื่อตรวจสอบ) จากนั้นอัลกอริทึมถอดรหัสเปิดเผยและสามารถจัดการได้

Javascript ต้องการคอนเทนเนอร์ที่ปลอดภัยอย่างสมบูรณ์และความสามารถในการปรับใช้ตัวแปรและฟังก์ชั่นส่วนตัวที่เหมาะสมสำหรับล่าม js เท่านั้น แต่นี่เป็นการละเมิดความปลอดภัยของผู้ใช้เนื่องจากข้อมูลการติดตามสามารถใช้งานได้โดยไม่ต้องรับโทษ

ดังนั้นจาวาสคริปต์จะไม่ปลอดภัยอย่างสมบูรณ์


-29

เลขที่

localStorage สามารถเข้าถึงได้โดยหน้าเว็บใด ๆ และถ้าคุณมีคีย์คุณสามารถเปลี่ยนแปลงข้อมูลใด ๆ ที่คุณต้องการ

ที่ถูกกล่าวว่าหากคุณสามารถกำหนดวิธีการเข้ารหัสคีย์ได้อย่างปลอดภัยมันไม่สำคัญว่าคุณจะถ่ายโอนข้อมูลได้อย่างไรหากคุณสามารถเก็บข้อมูลไว้ในการปิดการทำงานข้อมูลนั้นก็ค่อนข้างปลอดภัย


19
ไม่สามารถใช้กับ "หน้าเว็บใด ๆ " สามารถเข้าถึงหน้าในโดเมนปัจจุบันเท่านั้น
dtabuenc

@dabuenc ตรงกันข้ามฉันทำปากกาสักครู่หนึ่งที่แสดงให้คุณเห็นทุกคู่คีย์ / ค่าใน LocalStorage ของคุณโดยไม่แฮ็ค
hellol11

3
Nope! ขอโทษ ที่จัดเก็บในตัวเครื่องแยกต่างหากสำหรับแต่ละโดเมน รหัสที่ทำงานในโดเมนหนึ่งไม่สามารถเข้าถึงค่าที่เก็บไว้ในที่เก็บข้อมูลภายในโดยโดเมนอื่น ตัวอย่างเช่น google.com เก็บสิ่งต่าง ๆ ไว้ในที่จัดเก็บในตัวเครื่อง คุณจะไม่สามารถแสดงรายการคีย์ใด ๆ จาก google.com ในตัวอย่างปากกาของคุณ
dtabuenc

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