ความปลอดภัยของ Android SharedPreference


118

ฉันสงสัยเกี่ยวกับความปลอดภัยของค่ากำหนดที่ใช้ร่วมกัน

เป็นไปได้หรือไม่ที่จะเข้าถึงการกำหนดลักษณะที่ใช้ร่วมกันแม้ว่าจะสร้างขึ้นใน MODE_PRIV (0)
เป็นไปได้ไหมที่จะแสดงรายการค่ากำหนดที่ใช้ร่วมกันทั้งหมดจากนั้นดึงการตั้งค่าทั้งหมดจากแอปอื่น ๆ
sharedpreferences เป็นสถานที่ที่ดีในการใส่ข้อมูลที่ละเอียดอ่อนเช่นรหัสผ่านหรือโทเค็นรับรองความถูกต้องหรือไม่

ขอบคุณ



น่าดูพร้อมคำตอบที่ดี ค่ากำหนดที่ใช้ร่วมกันบอกได้มากเกี่ยวกับรูปแบบการเขียนโปรแกรมของผู้พัฒนา
Vishwa Ratna

คำตอบ:


232

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

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

หากคุณกังวลเกี่ยวกับการเข้าถึงค่ากำหนดของคุณ (หรือข้อมูลใด ๆ ที่เขียนโดยแอปพลิเคชันของคุณ) คุณจะต้องเข้ารหัส หากคุณกังวลเกี่ยวกับเรื่องนี้คุณจะต้องเข้าใจว่าจำเป็นต้องมีการป้องกันมากน้อยเพียงใดสำหรับระดับความเสี่ยงที่คุณเห็น มีการอภิปรายอย่างกว้างขวางเกี่ยวกับเรื่องนี้ในApplication Security for the Android Platformซึ่งเพิ่งเผยแพร่ในเดือนธันวาคม 2554 (ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียนหนังสือเล่มนี้)


2
มีเอกสารอย่างเป็นทางการที่พูดถึงเรื่องนี้หรือไม่? คุณมีข้อมูลอ้างอิงหรือไม่?
clu

26

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

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

https://github.com/sveinungkb/encrypted-userprefs

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


8
แล้วคุณจะบันทึกคีย์ที่สร้างขึ้นได้อย่างไร?
Olayinka

3
@Olayinka การเข้ารหัสด้วยคีย์อื่นจะปลอดภัยกว่าและบันทึกในไฟล์SharedPref. แต่แล้วจะทำอย่างไรกับคีย์อื่น ๆ ? อย่างจริงจังสถานการณ์ที่ดีที่สุดคือการส่งคีย์ที่เข้ารหัสและ UID ของอุปกรณ์ไปยังเซิร์ฟเวอร์โดยใช้ SSL เพื่อเก็บไว้ที่นั่นและเรียกคืนตามต้องการ ซึ่งจะต้องมีการเชื่อมต่อ แต่จะทำให้คุณขึ้นบัญชีดำอุปกรณ์และข้อมูลทั้งหมดก็ถูกทิ้งในถังขยะ หากไม่มีการเชื่อมต่ออินเทอร์เน็ตอย่างต่อเนื่องการพยายามเข้ารหัสข้อมูลใด ๆ ก็ไม่ปลอดภัย 100%
Paulo Avelar

ฉันใช้วิธีแก้ปัญหาข้างต้น ... ได้ผล 9 ใน 10 ครั้ง .. แต่ฉันได้รับข้อผิดพลาด: 1e06b065: Cipher functions: EVP_DecryptFinal_ex: BAD_DECRYPT "ครั้ง.. มีใครคิดบ้างไหม
Raj Trivedi

3
@PauloAvelar ใช้ Android KeyStore สำหรับการจัดเก็บระยะยาวและการดึงคีย์การเข้ารหัส คีย์จะไม่ถูกเก็บไว้ในแอปพลิเคชันดังนั้นจึงไม่สามารถถูกบุกรุกได้ ห้องสมุดที่ให้มาไม่ได้ใช้ มันบันทึกความลับในรหัสจึงไม่ปลอดภัย
apex39

13

ปกติไม่มีพวกเขาไม่สามารถเข้าถึงได้โดยปพลิเคชันอื่น ๆ แต่คุณควรทราบว่า SharedPreferences จะถูกเก็บไว้เป็นไฟล์ XML ใน/data/data/ไดเรกทอรีซึ่งเป็นหลักหมายความว่าใด ๆแอพลิเคชันที่มีสิทธิ์ superuserบนฝังรากอุปกรณ์สามารถเข้าถึงSharedPreferences, แม้ว่าพวกเขา สร้างด้วยMODE_PRIV


3

เป็นไปได้หรือไม่ที่จะเข้าถึงการกำหนดลักษณะที่ใช้ร่วมกันแม้ว่าจะสร้างขึ้นใน MODE_PRIV (0)

ตามรหัสหมายเลข แต่คุณสามารถดึงไฟล์แอปพลิเคชันได้หากคุณมีสิทธิพิเศษสำหรับผู้ใช้ขั้นสูง

เป็นไปได้ไหมที่จะแสดงรายการค่ากำหนดที่ใช้ร่วมกันทั้งหมดจากนั้นดึงการตั้งค่าทั้งหมดจากแอปอื่น ๆ

หากคุณเป็นผู้ใช้ขั้นสูง (อุปกรณ์ที่รูท) คุณสามารถดึงไฟล์ส่วนตัวทั้งหมดของแอพได้

sharedpreferences เป็นสถานที่ที่ดีในการใส่ข้อมูลที่ละเอียดอ่อนเช่นรหัสผ่านหรือโทเค็นรับรองความถูกต้องหรือไม่

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


จะถูกแฮ็กได้ง่ายๆได้อย่างไร?
John Sardinha

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