سلام، بعد یه مدت تاخیر این دفعه با یه پست در مورد امنیت توی اندروید اومدم.😉🔒
داستان از این قراره که اگه در مورد اینکه توی پروژتون کلید های حساس مثل API رو کجا بذارید که امن باشه تحقیق کنید، میبینید که اکثر منابع روش ذخیره سازی کلید ها توی فایل gradle.properties یا local.properties رو یاد میدن بهتون.
ولی روش پیشنهادی اینه که بیاید فایل properties. مخصوص خودتونو بسازید.
فایل local.properties یه فایل رزرو شده برای اطلاعات مربوط به AGP (android gradle plugin) هستش و تغییر دادنش ممکنه مشکلاتی رو براتون ایجاد کنه
وقتی شما این فایل رو باز کنید هم میبینید که بهتون هشدار داره این فایل رو تغییر ندید چون تغییرات شما پاک میشن به صورت خودکار.
از طرف دیگه فایل gradle.properties برای اطلاعات gradle در سطح پروژه هست و گاهی ممکنه توی ورژن کنترلتون در کنار سورس کد پروژه لحاظ بشه.
این فایل اصولا جای مناسبی برای ذخیره اطلاعات حساس مثل کلید هاتون نیست ، مخصوصا وقتی دارید پروژتون رو به اشتراک میگذارید.
خب حالا برای اینکه فایل properties. خودتونو بسازید باید مراحل زیر رو یکی یکی انجام بدید:
قدم اول : روی پوشه اصلی پروژتون فایل apikeys.properties رو بسازید. البته میتونید از اسم دلخواه استفاده کنید فقط مهمه تهش properties. باشه. بعدش داخلش میتونید یه همچین چیزی رو بنویسید:
#put your api key in the newly created .properties file API_KEY = "abcd1234"
(برای اینکه فایل رو توی پوشه درستی ایجاد کنید نمایش پوشه هارو بزارید روی حالت project نه android)
قدم دوم : حالا باید این فایلی که ساختید رو به gitignore اضافه کنید تا شامل گیت نشه. حواستونم باشه وقتی داشتید فایلو میساختید اگر پیغام افزودن فایل به گیت اومد نباید accept میکردید.
*.iml .gradle /local.properties /.idea/caches .... #put your .properties file here apikeys.properties
قدم سوم : توی فایل build.gradle میتونید اطلاعاتی که توی فایل properties. داشتید روی لود کنید که بعدا توی کداتون قابل استفاده باشه:
android { ... defaultConfig { ... //load the values from .properties file val keystoreFile = project.rootProject.file("apikeys.properties") val properties = Properties() properties.load(keystoreFile.inputStream()) //return empty key in case something goes wrong val apiKey = properties.getProperty("API_KEY") ?: ""
قدم چهارم : توی اندروید یه کلاسی به اسم BuildConfig وجود داره که به صورت خودکار توسط پلاگین gradle در فرایند build ایجاد میشه و شامل اطلاعات مختلفی هستش که توی کداتون میتونید ازش استفاده کنید.
اطلاعات درون فایل properties. ما هم با استفاده از این کلاس قابل دسترسیه ، منتها برای اینکه این دسترسی ایجاد بشه باید در ادامه کد های قبلی، این تیکه کد رو هم اضافه کنید:
//this is from the above previous code val apiKey = properties.getProperty("API_KEY") ?: "" buildConfigField( type = "String", name = "API_KEY", value = apiKey )
تابع buildConfigField برای تزریق کردن اطلاعات مختلف مثل کلید Api به کلاس BuildConfig استفاده میشه.
این تابع 3 تا ورودی میگیره:
ا type : نوع مقدارتون که توی مثال ما یه String هستش
ا name : اسم متغیری که توی فایل properties. دادید
ا value : مقدار متغیر که خب برای ما همون کلید API هست که تونستیم توی کد های قبل بدستش بیاریم.
این باعث میشه توی کلاس BuildConfig یه متغیر به اسم API_KEY با نوع String ساخته بشه با مقداری که توی فایل properties. هست.
قدم پنجم : با استفاده از کلاس BuildConfig به کلیدتون دسترسی پیدا کنید. کافیه کد زیر رو بنویسید:
class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //call BuildConfig to access its API_KEY Constant val apiKey = BuildConfig.API_KEY Log.i("tag", apiKey) } }
با این روش وقتی شما کداتونو به اشتراک میگذارید توی گیتهاب ، مغادیر مهمتون که داخل فایل properties. تعریفشون کردید در دسترس بقیه قرار نمیگیره.
امیدوارم بدردتون خورده باشه این آموزش، اگه اینطوره میتونید با لایک کردنش حمایتتونو نشون بدید ⭐
اگرم دوست دارید مبحث دیگه ای رو توضیح بدم حتما برام کامنتش کنید 🙏