จัดเก็บข้อมูลลับอย่างปลอดภัยในเว็บแอปพลิเคชันฝั่งไคลเอ็นต์


11

ฉันมีเว็บแอปพลิเคชันที่จะเป็นเทคโนโลยีฝั่งไคลเอ็นต์ทั้งหมด (HTML, CSS, JavaScript / AngularJS, ฯลฯ ... ) เว็บแอปพลิเคชันนี้กำลังโต้ตอบกับ REST API เพื่อเข้าถึงและแก้ไขข้อมูล ตอนนี้มันยังไม่ได้ตัดสินใจว่าจะใช้ระบบรับรองความถูกต้องประเภทใด REST API

จากความเข้าใจของฉันระบบการตรวจสอบความถูกต้อง API ประเภทใด ๆ (คีย์ API, OAuth 1/2, ฯลฯ ... ) จะมีข้อมูลบางอย่างที่ต้องเก็บเป็นความลับมิฉะนั้นการเข้าถึงอาจถูกบุกรุกได้ สำหรับคีย์ API คีย์เหล่านั้นต้องเป็นความลับสำหรับ OAuth 2 ไคลเอนต์ลับ / โทเค็นการเข้าถึง / โทเค็นการรีเฟรชจำเป็นต้องเก็บเป็นความลับฉันแน่ใจว่าสี่คีย์ที่เกี่ยวข้องใน OAuth 1 ต้องเก็บเป็นความลับ (ไม่ใช่ มีประสบการณ์มากเกินไปกับ OAuth 1) ฉันพยายามคิดว่าหากมีวิธีการจัดเก็บสิ่งที่เป็นความลับนี้ในเว็บแอปพลิเคชันฝั่งไคลเอนต์ที่บริสุทธิ์โดยไม่มีการเรียงลำดับชั้นกลางบนฝั่งเซิร์ฟเวอร์

ฉันพยายามคิดเกี่ยวกับสิ่งนี้และฉันไม่สามารถนึกถึงสถานที่ที่จะทำเช่นนั้นได้ ฉันหมายถึงฉันไม่สามารถเก็บไว้ในจาวาสคริปต์เพราะทุกคนสามารถดูแหล่งข้อมูลหรือเปิดคอนโซลและรับข้อมูลได้ ฉันไม่แน่ใจ 100% ว่า localStorage มีความปลอดภัยแค่ไหนและหากผู้ใช้สามารถเข้าถึง / แก้ไขข้อมูลนั้นได้ แม้ว่าที่เก็บข้อมูลในเครื่องจะมีความปลอดภัยสองวิธีที่ฉันสามารถนึกถึงการรับข้อมูลลงในนั้นไม่ได้ วิธีหนึ่งคือเพียงเก็บข้อมูลในซอร์สโค้ดจาวาสคริปต์ซึ่งเป็นสิ่งที่ไม่ปลอดภัยที่สุดที่ฉันคิดได้ ตอนนี้ถ้าฉันใช้บางอย่างเช่น OAuth 2 ซึ่ง api ที่เหลือจะให้โทเค็นฉันนั่นจะไม่ปลอดภัย (ดีกว่าตัวเลือกแรก) เพราะโทเค็นเหล่านั้นจะถูกส่งกลับเป็นข้อความธรรมดาที่ใครก็ตามที่เห็น การร้องขอคอมพิวเตอร์ทำให้สามารถมองเห็นได้

มีวิธีใดบ้างที่จะมีแอปพลิเคชันที่ใช้งานฝั่งไคลเอ็นต์อย่างสมบูรณ์สามารถจัดเก็บข้อมูลลับได้อย่างปลอดภัยโดยไม่ต้องมีเลเยอร์กลางที่ฝั่งเซิร์ฟเวอร์



Localstorage เป็นแบบเฉพาะเบราว์เซอร์ แต่การใช้ Opera บน Windows เป็นตัวอย่างเป็นเพียงไฟล์ดิสก์บางไฟล์ในโฟลเดอร์โปรไฟล์ของผู้ใช้ดังนั้นจึงไม่มีการป้องกันเป็นหลัก
Ross Patterson

วิธีหนึ่งคือการเก็บความลับบนเซิร์ฟเวอร์ใน db และมี application_id บนไคลเอ็นต์เท่านั้น จากนั้นทำแบบสอบถาม oauth จากเซิร์ฟเวอร์ดังนั้นนี่เป็นวิธีการพร็อกซีบางประเภท
Simon Polak

คำตอบ:


9

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

คุณสามารถซ่อนสิ่งต่าง ๆ และทำให้มันยากที่จะหาสิ่งของ แต่ในที่สุดพวกมันก็สามารถเอาออกมาได้ถ้าพวกเขาพยายามอย่างหนักพอ


4
^ นี้ "ความลับ" เป็นข้อมูลลับอย่างไรและใช้เวลาและเงินเท่าไรในการปกป้องข้อมูลนั้นคุ้มค่าจริงหรือไม่ ความพยายาม "มาตรฐานอุตสาหกรรม" อาจเพียงพอ
DaveE

+1 คำตอบที่ยอดเยี่ยม ด้วยดีบักเกอร์ JavaScript ฉันสามารถเปลี่ยนแอปพลิเคชันของคุณดูค่ากลางฯลฯ หากฉันต้องการข้อมูลฉันจะได้รับ
Ross Patterson

2

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


0

หนึ่งตัวเลือกสำหรับ REST API เพื่อให้สิทธิ์การเข้าถึงหรือไม่อิงตามการเข้าสู่ระบบของผู้ใช้ สามารถส่งคืนโทเค็นที่อิงเซสชัน (guid, hash string, อะไรก็ได้ที่คุณต้องการ) ซึ่งสามารถส่งผ่านไปยังการเรียกใช้ REST API อื่น ๆ เพื่อตรวจสอบสิทธิ์การเข้าถึง

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

ไม่คุ้นเคยกับ OAuth et al แต่ฉันไม่เห็นเหตุผลที่น่าสนใจเพื่อเก็บข้อมูลการตรวจสอบสิทธิ์อย่างต่อเนื่อง ...


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