ความลับของ OAuth ในแอปมือถือ


137

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

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

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

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

อีกอย่าง: ฉันไม่เชื่อว่าความลับนั้นเกี่ยวข้องกับการขอโทเค็นการเข้าถึงในตอนแรกดังนั้นจึงสามารถทำได้โดยไม่ต้องเกี่ยวข้องกับเซิร์ฟเวอร์ของเราเอง ฉันถูกไหม?


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

แม้ว่าผู้ใช้จะอนุญาตให้คุณเข้าถึงบัญชีของพวกเขาแล้ว (ใน Twitter) คุณต้องใช้ความลับที่ได้รับจากบริการที่คุณพยายามเข้าถึง ความลับนี้ใช้ในการสื่อสารทั้งหมดกับเซิร์ฟเวอร์ร่วมกับคีย์การตรวจสอบสิทธิ์และคีย์อื่น ๆ ใช่คุณสามารถจัดเก็บคีย์การเข้าถึงได้ แต่ไม่ควรจัดเก็บความลับเนื่องจากสามารถใช้กับคีย์การตรวจสอบสิทธิ์ใด ๆเพื่อละเมิดบริการได้ อีกครั้งฉันยินดีที่จะได้รับการแก้ไขจากผู้ที่รู้ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้
Felixyz

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

@poke คีย์การตรวจสอบสิทธิ์ที่ได้รับเมื่อผู้ใช้อนุมัติแอปของคุณกับผู้ให้บริการควรได้รับการบันทึกไว้ แต่โทเค็นลับที่คุณได้รับจากผู้ให้บริการก่อนที่จะปล่อยแอปไม่ควร (ในกรณีของแอปเดสก์ท็อปหรือมือถือหากเป็น เว็บแอปคุณสามารถจัดเก็บคีย์บนเซิร์ฟเวอร์ได้อย่างชัดเจนตามที่ระบุไว้ในคำถาม)
Felixyz

4
ตามความเข้าใจของฉันเกี่ยวกับ oAuth - ในกรณีของแอปเดสก์ท็อปมันง่ายมากที่จะดมกลิ่น / ตรวจสอบการรับส่งข้อมูล HTTP / HTTPS ด้วยเครื่องมือเช่นนี้ieinspector.com/httpanalyzer/index.html ดังนั้นโทเค็นและโทเค็นลับของคุณจึงสามารถพบได้มาก ได้อย่างง่ายดาย ดังนั้นการคุ้มครองเพียงอย่างเดียวคือความลับของผู้บริโภคของคุณ ตอนนี้หากคุณเก็บความลับไว้ในแอพและมีคนค้นพบมันจะกลายเป็นเรื่องเล่น ๆ ของเด็กที่แอบอ้างเป็นแอพอื่นเป็นแอพของคุณ แก้ไขฉันถ้าฉันผิด
Varun

คำตอบ:


38

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

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

วิธีแก้ปัญหาคือต้องมีความลับที่แตกต่างกันสำหรับแอปเดสก์ท็อปแต่ละตัว OAuth ไม่ได้ทำให้แนวคิดนี้ง่าย วิธีหนึ่งคือให้ผู้ใช้ไปสร้างความลับด้วยตัวเองและป้อนรหัสด้วยตัวเองลงในแอปเดสก์ท็อปของคุณ (แอพ facebook บางตัวทำคล้าย ๆ กันมานานแล้วโดยให้ผู้ใช้ไปและสร้าง facebook เพื่อตั้งค่า quizes ที่กำหนดเองและ อึ). ไม่ใช่ประสบการณ์ที่ดีสำหรับผู้ใช้

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

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

มีการพูดคุยเกี่ยวกับปัญหาออนไลน์:

http://blog.atebits.com/2009/02/fixing-oauth/ http://groups.google.com/group/twitter-development-talk/browse_thread/thread/629b03475a3d78a1/de1071bf4b820c14#de1071bf4b820c14

โซลูชันของ Twitter และ Yammer เป็นโซลูชันพินการตรวจสอบสิทธิ์: https://dev.twitter.com/oauth/pin-based https://www.yammer.com/api_oauth_security_addendum.html


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

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

7
แค่อยากรู้: คุณจะทราบได้อย่างไรว่าสิ่งที่โทรไปยังพร็อกซีเซิร์ฟเวอร์ของคุณนั้นถูกต้องตามกฎหมาย
davidtbernal

1
เพื่อตอบสนองต่อ notJim: ความเสี่ยงหลักในการปล่อยให้ความลับของผู้บริโภคของคุณหลุดออกไปคือแอปพลิเคชันที่เป็นอันตราย (หรือโง่เขลา) สามารถพัฒนาได้โดยใช้แอปพลิเคชันนี้ทำให้เสื่อมเสียชื่อเสียงของคุณและเพิ่มความเสี่ยงในการปิดแอปพลิเคชันที่ถูกต้องตามกฎหมายเนื่องจากการละเมิด / การใช้งานในทางที่ผิด ด้วยการพร็อกซีการโทรทั้งหมดที่ต้องใช้ความลับของคุณผ่านทางเว็บแอปพลิเคชันที่คุณควบคุมคุณจะกลับมาอยู่ในตำแหน่งที่คุณสามารถตรวจสอบรูปแบบการละเมิดและเพิกถอนการเข้าถึงของผู้ใช้หรือระดับโทเค็นการเข้าถึงก่อนที่ API ที่คุณใช้งานอยู่จะตัดสินใจปิด ลงบริการทั้งหมดของคุณ
quasistoic

ฉันเห็นด้วยกับ quasistoic ที่นี่คุณจะต้องใช้เบราว์เซอร์ที่เปิดใช้งาน SSL เพื่อจัดการกับการโทร oauth นี่เป็นสิ่งที่ดีด้วยเหตุผลบางประการรวมถึงการจัดการการอัปเดตความปลอดภัยในอนาคตได้อย่างง่ายดายและไม่มีสิ่งใดในแอปพลิเคชันจริงที่จะต้องอัปเดตเมื่อเวลาผ่านไป Zac ชี้ให้เห็นว่า Twitter เสนอโซลูชัน PIN ซึ่งจริงๆแล้วฉันก็คิดเช่นกันเพราะคุณไม่สามารถเชื่อถือแอปพลิเคชันเพื่อรับรหัสได้อย่างปลอดภัย ฉันขอแนะนำให้ใช้ 'Nonce' กับการเข้ารหัสที่ทันสมัยพร้อมกับ PIN และความลับในการพร็อกซีคำขอผ่านเว็บเซิร์ฟเวอร์
มาร์ค

18

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

ด้วย OAuth 1.0 (Twitter) จำเป็นต้องใช้ความลับในการเรียก API การเรียกพร็อกซีผ่านเซิร์ฟเวอร์เป็นวิธีเดียวที่จะทำให้ความลับไม่ถูกบุกรุก

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

(ฉันเป็นผู้แก้ไขข้อมูลจำเพาะ OAuth 2.0)


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

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

3
@DickHardt แต่ในสถานการณ์นี้คุณจะแน่ใจได้อย่างไรว่าแอปพลิเคชันบนมือถือเป็นแอปของคุณจริงๆไม่ใช่แอปหลอกลวง
Rafael Membrives

11

วิธีแก้ปัญหาหนึ่งคือการฮาร์ดโค้ดรหัสลับ OAuth ลงในโค้ด แต่ไม่ใช่สตริงธรรมดา ทำให้ยุ่งเหยิงไม่ทางใดก็ทางหนึ่ง - แบ่งออกเป็นส่วน ๆ เปลี่ยนอักขระตามออฟเซ็ตหมุนมันทำสิ่งเหล่านี้หรือทั้งหมด แครกเกอร์สามารถวิเคราะห์รหัสไบต์ของคุณและค้นหาสตริงได้ แต่รหัสการทำให้สับสนอาจเข้าใจได้ยาก

ไม่ใช่วิธีแก้ปัญหาที่เข้าใจผิด แต่เป็นวิธีที่ถูก

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


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

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

9
การอุดฟันไม่ใช่ความปลอดภัยเลย สิ่งนี้แย่กว่าการไม่มีความปลอดภัยเลยเพราะมันทำให้นักพัฒนารู้สึกถึงความปลอดภัยที่ผิดพลาด en.wikipedia.org/wiki/Security_through_obscurity
Paul Legato

9
"การอุดฟันไม่ใช่ความปลอดภัยเลยสิ่งนี้แย่กว่าไม่มีความปลอดภัยเลยเพราะมันทำให้นักพัฒนารู้สึกถึงความปลอดภัยที่ผิดพลาด" ไร้สาระ. ไม่มีใครบอกว่าความสับสนทำให้เกิดความปลอดภัยที่ดี แต่ถ้าฉันจะเผยแพร่ความลับ OAuth กับ apk ของฉันก็จะดีกว่าที่จะทำให้สับสนมากกว่าไม่ การปิดบังคือสิ่งที่ Google แนะนำเมื่อจัดเก็บคีย์ / ความลับในแอป หากไม่มีอะไรอื่นมาตรการเหล่านี้จะช่วยให้แฮ็กเกอร์ไม่เป็นทางการอยู่เสมอซึ่งดีกว่าไม่มีอะไรเลย งบครอบคลุมเช่นคุณเท่ากับความปลอดภัยที่ไม่สมบูรณ์โดยไม่มีความปลอดภัย นั่นไม่เป็นความจริง ความไม่สมบูรณ์เป็นเพียงความไม่สมบูรณ์
Hungryghost

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

6

อย่าเก็บความลับไว้ในแอปพลิเคชัน

คุณต้องมีเซิร์ฟเวอร์ที่แอปพลิเคชันสามารถเข้าถึงได้ผ่านhttps (ชัดเจน) และคุณเก็บความลับไว้

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

จากนั้นหากคุณต้องการรับข้อมูลที่ละเอียดอ่อนใด ๆ จากบริการ (facebook, google, twitter ฯลฯ ) แอปพลิเคชันจะถามเซิร์ฟเวอร์ของคุณและเซิร์ฟเวอร์ของคุณจะให้ข้อมูลแก่แอปพลิเคชันต่อเมื่อมีการเชื่อมต่ออย่างถูกต้อง

ไม่มีตัวเลือกใด ๆ จริงๆยกเว้นการจัดเก็บไว้บนเซิร์ฟเวอร์ ไม่มีสิ่งใดในฝั่งไคลเอ็นต์ที่ปลอดภัย

บันทึก

ที่กล่าวว่านี่จะปกป้องคุณจากไคลเอนต์ที่เป็นอันตรายเท่านั้น แต่ไม่ใช่ไคลเอนต์จากการมุ่งร้ายคุณและไม่ใช่ไคลเอนต์จากไคลเอนต์ที่เป็นอันตรายอื่น ๆ (ฟิซิง) ...

OAuth เป็นโปรโตคอลที่ดีกว่าในเบราว์เซอร์มากกว่าบนเดสก์ท็อป / อุปกรณ์เคลื่อนที่


1
สิ่งนี้ไม่ทำให้ชีวิตของแฮ็กเกอร์ง่ายขึ้นหรือ! เนื่องจากตอนนี้ในการเข้าถึงทรัพยากรเซิร์ฟเวอร์ในทางเทคนิคเราจำเป็นต้องมีรหัสไคลเอ็นต์เนื่องจากเซิร์ฟเวอร์จะต่อท้ายความลับในคำขอ ฉันพลาดอะไรไปรึเปล่า?
Hudi Ilfeld

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

@Gudradain ฉันไม่แน่ใจว่าโซลูชันของคุณช่วยที่นี่ได้อย่างไรเนื่องจากทั้งหมดนี้สามารถทำได้โดยอัตโนมัติ: 1) ไคลเอ็นต์ที่ส่ง client_id ไปยังเซิร์ฟเวอร์ 2) เซิร์ฟเวอร์ส่งคืนโทเค็นการเข้าถึงสำหรับไคลเอ็นต์เพื่อส่งในคำขอถัดไป? ทำไม? แต่เอาเป็นว่าไม่เป็นไร 3) ขณะนี้แฮ็กเกอร์ได้รับการตรวจสอบสิทธิ์กับเซิร์ฟเวอร์แล้วและยังคงสามารถส่งคำขอ API / บริการใด ๆ ที่เขาต้องการได้โดยยังคงถูกแอบอ้างอยู่เบื้องหลังพร็อกซีเซิร์ฟเวอร์ของคุณ ฉันขาดอะไรที่นี่?
Ivo Pereira

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

@Gudradain ฉันไม่ได้แนะนำการไหลที่แน่นอนด้วยเหตุผลที่คุณกล่าวถึงอย่างไรก็ตามการใช้ Proxy ตรงกลางจะไม่สามารถแก้ปัญหาได้ด้วยตัวมันเองเพราะมันจะเปิดประตูฟรีให้กับนักแสดงที่ไม่ดี อย่างไรก็ตามสิ่งนี้อาจช่วยบรรเทาปัญหาได้: medium.com/@benjamin.botto/… (สถาปัตยกรรมขั้นสูง -> ข้อพิจารณาด้านความปลอดภัย)
Ivo Pereira

4

มีนามสกุลใหม่เพื่อการอนุญาตรหัสแกรนท์ประเภทเรียกว่าKey หลักฐานสำหรับรหัสตลาดหลักทรัพย์ (PKCE) ด้วยวิธีนี้คุณไม่จำเป็นต้องมีความลับของลูกค้า

PKCE (RFC 7636) เป็นเทคนิคในการรักษาความปลอดภัยไคลเอนต์สาธารณะที่ไม่ใช้ความลับไคลเอนต์

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

จากhttps://oauth.net/2/pkce/

สำหรับข้อมูลเพิ่มเติมคุณสามารถอ่านRFC 7636ฉบับเต็มหรือบทนำสั้น ๆนี้


ระวังว่าสิ่งนี้ยังสามารถนำไปสู่การเลียนแบบลูกค้าได้: tools.ietf.org/html/rfc6749#section-10.2
Ivo Pereira

2

นี่คือสิ่งที่ต้องคิด Google นำเสนอ OAuth สองวิธี ... สำหรับเว็บแอปโดยที่คุณลงทะเบียนโดเมนและสร้างคีย์เฉพาะและสำหรับแอปที่ติดตั้งโดยคุณใช้คีย์ "ไม่ระบุตัวตน"

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


2

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

สามารถดูคำอธิบายวิธีการใช้งานได้ที่นี่: https://aaronparecki.com/articles/2012/07/29/1/oauth2-simplified#mobile-apps


ให้บริการรองรับ "การไหลของฝั่งไคลเอ็นต์" หลายคนไม่ต้องการรหัสไคลเอ็นต์และรหัสลับไคลเอ็นต์เพื่อรับโทเค็นการเข้าถึง
Damian Yerrick

0

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

ฉันคิดเสมอว่าความตั้งใจที่อยู่เบื้องหลัง OAuth คือเพื่อให้ Tom, Dick และ Harry ทุกคนที่มี mashup ไม่จำเป็นต้องเก็บข้อมูลรับรอง Twitter ของคุณให้ชัดเจน ฉันคิดว่ามันช่วยแก้ปัญหานั้นได้ดีแม้ว่าจะมีข้อ จำกัด ก็ตาม นอกจากนี้ยังไม่ได้ออกแบบมาโดยคำนึงถึง iPhone จริงๆ


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

OAuth 1 ต้องลงนามในแต่ละคำขอ OAuth 2 ต้องการโทเค็นการเข้าถึงเท่านั้น ทั้งสองต้องใช้คีย์และความลับเมื่อได้รับโทเค็น
Dick Hardt

0

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

ขั้นตอนการอนุญาตเบราว์เซอร์ของการติดตั้ง OAuth ของ Google App Engine จะนำคุณไปยังหน้าที่มีข้อความเช่น "ไซต์ <some-site> กำลังขอเข้าถึงบัญชี Google ของคุณสำหรับผลิตภัณฑ์ที่ระบุไว้ด้านล่าง"

YourApp (yourapp.appspot.com) - ไม่มีส่วนเกี่ยวข้องกับ Google

ฯลฯ

ใช้ <some-site> จากชื่อโดเมน / โฮสต์ที่ใช้ใน URL เรียกกลับที่คุณระบุซึ่งอาจเป็นอะไรก็ได้บน Android หากคุณใช้รูปแบบที่กำหนดเองเพื่อสกัดกั้นการโทรกลับ ดังนั้นหากคุณใช้การเข้าถึงแบบ "ไม่ระบุตัวตน" หรือความลับของผู้บริโภคของคุณถูกบุกรุกใคร ๆ ก็สามารถเขียนผู้บริโภคที่หลอกให้ผู้ใช้เข้าถึงแอป gae ของคุณได้

หน้าการให้สิทธิ์ Google OAuth ยังมีคำเตือนมากมายซึ่งมีความรุนแรง 3 ระดับขึ้นอยู่กับว่าคุณกำลังใช้ 'ไม่ระบุตัวตน' ความลับของผู้บริโภคหรือคีย์สาธารณะ

สิ่งที่น่ากลัวสำหรับผู้ใช้ทั่วไปที่ไม่เข้าใจในทางเทคนิค ฉันไม่คาดหวังว่าจะมีเปอร์เซ็นต์ความสำเร็จในการสมัครสูงกับสิ่งประเภทนั้นในทางนี้

บล็อกโพสต์นี้ชี้แจงว่าความลับของผู้บริโภคใช้ไม่ได้จริงกับแอปที่ติดตั้ง http://hueniverse.com/2009/02/should-twitter-discontinue-their-basic-auth-api/


0

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

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

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

จะได้ผลหรือไม่


4
คิดดี แต่เปล่า แครกเกอร์จะเห็นไบนารีที่ชี้ไปยังที่อยู่ของค่าคงที่ของระบบปฏิบัติการ
GrayB


0

Facebook ไม่ได้ใช้ OAuth อย่างเคร่งครัด (ยัง) แต่พวกเขาได้ใช้วิธีที่ไม่ให้คุณฝังความลับของคุณในแอพ iPhone ของคุณ: https://web.archive.org/web/20091223092924/http://wiki Developers.facebook.com/index.php/Session_Proxy

สำหรับ OAuth ใช่ยิ่งฉันคิดเกี่ยวกับเรื่องนี้เราก็ยัดเยียด บางทีนี่อาจจะแก้ไขได้


1
wiki.developers.facebook.com ตายแล้ว
Hugo

0

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

วิธีแก้ปัญหาหนึ่งคือการมีความลับแบบไดนามิกซึ่งประกอบด้วยการประทับเวลาที่เข้ารหัสด้วยคีย์และอัลกอริทึมการเข้ารหัส 2 ทางส่วนตัว จากนั้นบริการจะถอดรหัสความลับและกำหนดว่าการประทับเวลาคือ +/- 5 นาทีหรือไม่

ด้วยวิธีนี้แม้ว่าความลับจะถูกบุกรุก แต่แฮ็กเกอร์จะสามารถใช้งานได้สูงสุด 5 นาทีเท่านั้น


-3

ตามที่คนอื่น ๆ กล่าวไว้ไม่ควรมีปัญหาในการจัดเก็บความลับไว้ในเครื่อง

ยิ่งไปกว่านั้นคุณสามารถพึ่งพารูปแบบการรักษาความปลอดภัยที่ใช้ UNIX ของ Android ได้เสมอมีเพียงแอปพลิเคชันของคุณเท่านั้นที่สามารถเข้าถึงสิ่งที่คุณเขียนลงในระบบไฟล์ เพียงเขียนข้อมูลลงในออบเจ็กต์ SharedPreferences เริ่มต้นของแอปของคุณ

เพื่อให้ได้ความลับเราจะต้องได้รับการเข้าถึงรูทของโทรศัพท์ Android


3
ดังที่ใครเอ่ย? หากคุณหมายถึงความคิดเห็นของ poke โปรดดูคำตอบของฉันว่า secret! = คีย์การตรวจสอบสิทธิ์ หลังสามารถจัดเก็บได้อย่างปลอดภัยอดีตไม่สามารถทำได้ ฉันไม่รู้เกี่ยวกับ Android แต่การเข้าถึงรูทของ iPhone นั้นไม่ยากเลย โปรดทราบว่าความลับนั้นเหมือนกันในทุกอินสแตนซ์ของแอปดังนั้นผู้โจมตีจะต้องเข้าถึงไบนารีเพียงตัวเดียว และแม้ว่าพวกเขาจะไม่สามารถเข้าถึงรูทบนอุปกรณ์ได้ แต่พวกเขาก็สามารถรับมือกับไบนารีได้ในบางส่วนและดึงโทเค็นลับออกจากมัน
Felixyz

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