Android: การจัดเก็บชื่อผู้ใช้และรหัสผ่าน?


178

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


4
stackoverflow.com/a/786588/1166727ตรวจสอบสิ่งที่ @RetoMeier (หัวหน้าฝ่ายเทคนิคเพื่อการพัฒนา Android ที่ Google) ได้กล่าวเกี่ยวกับเรื่องนี้
tony gil

1
หากคุณกำลังมองหาวิธีที่ปลอดภัยที่สุดในการจัดเก็บข้อมูลรับรองอ่านคำตอบนี้stackoverflow.com/a/20560574/730807
Durai Amuthan.H

3
@ ทราบว่าคุณแก้ไขปัญหาของคุณอย่างไร
Erum

@Legend คุณสามารถโยนแสงในการบันทึก pwd ใน prefs หลังจากการเข้ารหัส .. เพราะฉันต้องการให้แอปของฉันทำงานโดยไม่มีอินเทอร์เน็ตแล้วฉันจะได้รับคีย์ได้อย่างไร .. (เพราะฉันไม่สามารถจัดเก็บคีย์บนอุปกรณ์)
eRaisedToX

คุณสามารถใช้ที่เก็บคีย์สำหรับ Api +18 developer.android.com/training/articles/keystore
Golnar

คำตอบ:


115

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

คำแนะนำจาก ( คู่มือ dev ของ Android ) คือ:

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

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

การใช้AccountMangerเป็นตัวเลือกที่ดีที่สุดสำหรับการจัดเก็บข้อมูลรับรอง SampleSyncAdapterให้เห็นตัวอย่างของวิธีการใช้มัน

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


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

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

4
หากคุณใช้AccountManager(ตามคำตอบของฉันและ @ Miguel ในทางอ้อม) และใครบางคนได้รับโทรศัพท์ GSM ของคุณพวกเขาจะต้องใช้ SIM ของคุณเพื่อเข้าถึงบัญชีของคุณเนื่องจากจะทำให้ข้อมูลรับรองที่เก็บไว้เป็นโมฆะ เมื่อซิมเปลี่ยน
Jon O

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

2
"การใช้ AccountManger เป็นตัวเลือกที่ดีที่สุดสำหรับการจัดเก็บข้อมูลรับรอง" ทำไม?
ลั

9

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

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

SampleSyncAdapter (เช่น @Miguel ที่กล่าวถึง) เป็นตัวอย่างที่ใช้ประโยชน์จากข้อมูลรับรองบัญชีที่เก็บไว้


3
มีเอกสารอยู่ที่ไหนที่ AccountManager จะ "ทำให้ข้อมูลประจำตัวในท้องถิ่นใช้ไม่ได้หากซิมการ์ดเปลี่ยน"
Eric Levine

ไม่ใช่ว่าฉันรู้ อย่างไรก็ตามมันเป็นสิ่งที่ฉันเชื่อว่า / ยอมรับ / เข้าใจหลังจากผู้ใช้แอปของฉันบางคนมีปัญหาการตรวจสอบสิทธิ์ตามการสลับซิม
Jon O

1
ฉันไม่เห็นมันในรหัส JavaDocs หรือ AccountManager ดูเหมือนว่าคุณสมบัติที่ดีมันจะเป็นการดีที่จะตรวจสอบและทำความเข้าใจรายละเอียด
Eric Levine

2
ตาม @NikolayElenkov คุณลักษณะการเปลี่ยนซิมการ์ดที่ถูกต้องได้ถูกลบออก
ThomasW

2
@ThomasW คุณมีการอ้างอิงสำหรับที่? มันคงจะดีถ้าได้รับคำตอบที่ชัดเจนจากบางประเภท
Jon O

8

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

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

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


2
คุณสามารถโพสต์แหล่งที่มาที่แจ้งว่า accounts.db นั้นถูกเข้ารหัสได้หรือไม่? หรือคุณบอกว่าควรเข้ารหัสรหัสผ่านเฉพาะ
Michał K

1
@Riz ที่เก็บคีย์สำหรับการเข้ารหัสแล้ว ... เนื่องจากแอปของฉันทำงานโดยไม่ใช้อินเทอร์เน็ตดังนั้นไม่สามารถรับได้จากเครือข่าย
eRaisedToX




2

กับใหม่ (Android 6.0) ฮาร์ดแวร์ลายนิ้วมือและ API คุณสามารถทำมันในขณะนี้โปรแกรมตัวอย่าง GitHub


8
โปรเจ็กต์ตัวอย่างที่อ้างอิงสร้างคีย์ใน Android Key Store และใช้เพื่อสร้างรหัสเพื่อเข้ารหัสรหัสผ่าน รหัสผ่านและรหัสลับที่เข้ารหัสจะถูกเก็บไว้เป็นสตริงที่เข้ารหัส base64 ในการตั้งค่าที่ใช้ร่วมกัน เมื่อการพิสูจน์ตัวตนด้วยลายนิ้วมือสำเร็จคีย์ลับจะถูกดึงจาก Android Key Store และใช้กับรหัสถอดรหัสเพื่อถอดรหัสรหัสผ่านที่ถอดรหัส
mjwheat

@mjwheat สิ่งนี้มีประโยชน์มากเมื่อต้องการทำความเข้าใจกับสิ่งที่เกิดขึ้นในตัวอย่าง ขอบคุณ! หนึ่งในตัวพิมพ์เล็ก: "... เพื่อถอดรหัสรหัสผ่านที่เข้ารหัส"
muetzenflo

2

เหล่านี้จะถูกจัดอันดับอยู่ในลำดับของความยากลำบากที่จะทำลายข้อมูลที่ซ่อนของคุณ

  1. เก็บในข้อความที่ชัดเจน

  2. เก็บการเข้ารหัสโดยใช้คีย์สมมาตร

  3. การใช้ Android Keystore

  4. เก็บการเข้ารหัสโดยใช้คีย์ไม่สมมาตร

แหล่งที่มา: ที่ที่ดีที่สุดในการเก็บรหัสผ่านในแอพ Android ของคุณอยู่ที่ไหน

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

แหล่งที่มา: ใช้ Android Keystore อย่างง่าย ๆ ในการจัดเก็บรหัสผ่านและข้อมูลที่ละเอียดอ่อนอื่น ๆ


1

ข้อมูลที่http://nelenkov.blogspot.com/2012/05/storing-application-secrets-in-androids.htmlเป็นวิธีปฏิบัติที่ค่อนข้างเป็นธรรม แต่ "ใช้ - ซ่อน - android-apis" ตามแนวทาง เป็นสิ่งที่ควรพิจารณาเมื่อคุณไม่สามารถหลีกเลี่ยงการจัดเก็บข้อมูลประจำตัว / รหัสผ่านในเครื่องได้

ฉันได้สร้างส่วนสำคัญของแนวคิดนั้นที่https://gist.github.com/kbsriram/5503519ซึ่งอาจเป็นประโยชน์

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