آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

بهترین روش برای شناسه منحصر به فرد؟(حل شد)

علی  8 سال پیش  8 سال پیش
+2 0

با سلام خدمت دوستان :

لطفا کسانی جواب بدهند که در این زمینه تجربه بیشتری دارند :

با توجه به این که مک آدرس یا سریال نامبر گوشی پیشنهاد نمیشه برای گرفتن یه شناسه منحصر به فرد چه کاری اصولی تر هستش و امنیتش بالاتر هستش در هر گوشی؟ 

این راه پیشنهادی خود گوگل هستش :  

 String unigueID = UUID.randomUUID().toString().repalaceAll("-","");

 
 

خوب این هر بار که برنامه اجرا میشه یه آیدی جدید میسازه . ما چه جاهای می تونیم ازش استفاده کنیم وقتی هر بار تغییر می کنه؟ و چه پیشنهادهای دارید که بشه یه گوشی رو تشخیص داد که آیدی منحصر به فرد دارد ؟

https://developer.android.com/training/articles/user-data-ids.html#use_appropriate_identifiers

 
 برای این سوال 6 پاسخ وجود دارد. مشاهده پاسخ صحیح
پاسخ به سوال 
احمد  8 سال پیش
+1 0

برای قسمت دوم سوال که برنامه نصب هست یا نه 

 private boolean isPackageInstalled(String packagename, PackageManager packageManager) {
    try {
        packageManager.getPackageInfo(packagename, PackageManager.GET_ACTIVITIES);
        return true;
    } catch (NameNotFoundException e) {
        return false;
    }
}
پاسخ به سوال 
Criss  8 سال پیش
+2 0

استفاده از UUID در شکل بالا کابرد های دیگه ایی داره ، از اونجایی که احتمال ایجاد دو مقدار مشابه واقعا ناچیز و نزدیک به صفر هست میشه گفت هیچوقت دو مقدار تکراری ایجاد نمیشه

ولی برای گرفتن یک کد یونیک میتونید به شکل زیر استفاده کنید : (همچنین با توجه به آموزش استاد در بخش گرفتن اطلاعات دیوایس میتونید پارامترهای دیگری رو هم به زیر اضاف کنید)

     public static String getUUID() {
TelephonyManager telephonyManager = (TelephonyManager) G.context.getSystemService(Context.TELEPHONY_SERVICE);
WifiManager manager = (WifiManager) G.context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = manager.getConnectionInfo();
String macAddress = info.getMacAddress();

String imei = telephonyManager.getDeviceId();
String androidID = Secure.getString(G.context.getContentResolver(), Secure.ANDROID_ID);
return imei + "-" + macAddress + "-" + androidID;
}
+1 0
خوب این در اندروید ۶ به بعد اجازه دسترسی می خواد و من نمی خوام این عمل انجام بشه ؟ راه بهتری مد نظرتون نیست criss عزیز و مورد بالا که من اشاره کردم چه جاهای بیشتر مورد استفاده قرار می گیره؟ (8 سال پیش)
+2 0
اگر برتون مقدور هست SDK که پروژه رو باهاش توسعه میدید رو زیر 6 بیارید ، برای اینکه بدون استفاده از پرمیژن های اضافی این کار رو چطور میشه انجام داد باید سرچ کرد و اطلاعای ندارم ، برای UUID یک نمونه از کاربرهاش استفاده از اون در امن کردن اطلاعات ارسالی به سمت سرور هست که میتونه تا حدودی کمک کنه به اینکه حتی اگر برنامه Sniff بشه و URL ها و پارامترهای ارسالی شناسایی بشن ، کسی نتونه با استفاده از اون پارامتر ها و URL از جایی دیگه اطلاعات رو به سرور ارسال کنه ، این یکی از کاربرها هست برای امنیت به شکل ساده ، وقت کنم آموزشش رو میذارم که یک روش ساده و تقریبا غیر اصولی برای امنیت سرور هست (8 سال پیش)
پاسخ به سوال 
علی  8 سال پیش
0 0

کریس عزیز نمی تونم پایین تر از اندروید ۶ بگیرم متاسفانه . حالا به نظرت بازار از همین UUID استفاده کرده؟ من اگر clear data کنم اون شناسه دستگاه عوض میشه و یا اپ رو حذف کنم و دوباره نصب کنم.  احتمالا همین UUID استفاده شده و در یک SharedPreferences ذخیره میشه . ولی بازهم بازار یا دیجی کالا تو اندروید ۶ به بعد هم اجازه دسترسی نمی گیرند . پس از کجا می فهمن گوشی کی بوده!!!

0 0
از دوستان کسی راه حلی نداره که بشه یه آیدی منحصر به فرد از گوشی داشته باشیم ؟ یعنی مخصوص همون گوشی و در اندروید ۶ هم اجازه دسترسی نگیره . (8 سال پیش)
پاسخ به سوال 
امید  8 سال پیش
+1 0

همون راهی که خودتون در بالا گفتید بهترین راه هست به نظر من.

قبلا توی یک پروژه آنلاین این کار رو انجام دادم و خودم به صورت رندم یک عدد 10 رقمی تولید میکردم.(البته به دلایلی توی سرور این کار رو انجام میدادم)

میتونید به صورت زیر عمل کنید که مشکل ساز نشه:

 if (G.preferences.getBoolean ("running_first", true)) {
// تولید کد در صورت اولین اجرای برنامه و ذخیره سازی آن در Preferences
String unigueID = UUID.randomUUID().toString().repalaceAll("-","");

SharedPreferences.Editor editor = G.preferences.edit();
editor.putString("UUID", unigueID);
editor.commit();
}

بهترین کار این هست که این رو در اولین فایل اجرایی برنامتون مثل کلاس G و یا نهایتا در اولین اکتیویتی قرار بدید.

پاسخ به سوال 
Rabbit  8 سال پیش
+2 0

 پاسخ صحیح

به همون روشی که گفتید برایِ هرکس در اولین اجرا یک رشته منحصر به فرد تولید میکنید و این مقدار رو داخلِ گوشی و همچنین سرور ذخیره می‌کنیداز این به بعد برای شناساییِ کاربر میتونید از این رشته استفاده کنید.

اما طبیعیه که اگه clean بشه رشته از رویِ دستگاه پاک میشه ولی داخلِ سرور باقی میمونه. برایِ اینکه اگه کاربر برنامه رو پاک کرد اطلاعات از بین نره همراه با رشته منحصر به فرد بایستی mac address (یا ایمیل کاربر یا هر رشته منحصر به فرد دیگه) رو هم به سرور بفرستید و داخلِ دیتابیس ذخیره کنید. حالا هروقت کاربر دوباره برنامه رو نصب کرد ابتدا چک میکنید که آیا این مک آدرس داخلِ دیتابیس هست یا نه؟ اگه بود اون رشته قبلی رو براش در نظر میگیرید.

اگه دوست ندارید از سرور استفاده کنید یا از خودِ mac address. می‌تونید رویِ mac add یه تغییری بدید که فقط خودتون میدونید. مثلا ابتدا و وسط و انتهایِ آدرس چیزی اضافه کنید. یا مقدارِ کاراکترِ هر حرف رو بگیرید تبدیل به عدد کنید و مقداری به اون اضافه کنید، سپس دوباره به کاراکتر تبدیل کنید. به این شکل مثلا a میشه c. یا 9 میشه ;   و....

+1 0
ممنون . خوب در اندروید ۶ به بعد که پرمیژن می گیره راه خوبی نیست درسته؟؟؟ این راه حل های بالا هم یه جورای با حذف چیزهای که پرمیژن می گیرند عملی هستش. و این که آیا شما در مورد این راه اطلاعاتی دارید : لینک (8 سال پیش)
+2 0
چرا راهِ خوبی نباشه؟ اجازه دسترسی میگیره که کاربر بدونه شما به این اطلاعات دسترسی دارید. لینک برای ios بود. اصولا ما شناسه منحصر بفرد رو برای ارتباطِ امن میخوایم. یعنی چیزی باشه که کسی نتونه حدس بزنه و ما با اون هرکس رو بشناسیم. راهی هم که خودتون برایِ تولید این رشته گفتید خوب هست برای ذخیره سازی هم از سرور باید استفاده کنید در غیر اینصورت با حذف شدنِ برنامه اطلاعات از بین میره. (8 سال پیش)
+2 0
Rabbit جان من دیدم بازار در اندروید ۶ که نصب می کنم قسمت پرمیژن هاش همشون Allow هستند وقتی هم برنامه رو باز کردم در جاهای مختلف دیدم اجازه پرمیژن نمی گیره. اومدم توی اپ خودم targetSdkVersion 23 رو کردم targetSdkVersion 22 و دوباره نصب کردم برای اندروید ۶ و دیدم اجازه دسترسی نمی گیره دیگه و اپ بدون هیچ اجازه ای کار می کنه ! :) یافتم راهشو! (8 سال پیش)
0 0
علی داداش عنوان سوالت بزن حل شد جواب در پاسخ آخر به عنوان پاسخ درج کن (8 سال پیش)
0 0
علی اقا میشه توضیح بدی چی شد؟ یعنی targetsdk که زیر 23 باشه دیگه پرمیشن runtime نیازی نیست؟! (8 سال پیش)
0 0
زیر ۲۳ باشه وقتی اپ رو نصب می کنید برید قسمت پرمیشن می بینید به صورت پیش فرض اگر مثلا پرمیشنی تعریف کردید مثل Storage خودش فعال شده و اگر غیر فعال کنید می بینید پیامشو. و در داخل اپ دیگه ازتون اجازه دسترسی نمی پرسه. (8 سال پیش)
پاسخ به سوال 
میثاق  8 سال پیش
+1 0

من از این روش استفاده کردم خوشحال میشم نظرتون بدونم 

 

  Boolean isFirstRun = G.preferences.getBoolean("FIRST_TIME", true); 

if (isFirstRun) {
TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String serialIMEI = telephonyManager.getDeviceId();

String UUID = Common.getGenerateUUID();

if (serialIMEI == AppConfig.baseDevice || serialIMEI == null) {
int min = 1;
int max = 2100000000;//
Random random = new Random();
int randonSerialIMEI = random.nextInt(max - min + 1) + min;

if (serialIMEI == null) {
serialIMEI = randonSerialIMEI + "";
} else {
serialIMEI = serialIMEI + String.valueOf(randonSerialIMEI);
}

G.editor.putString("IMEA_KEY_APP", serialIMEI);
G.IMEI = serialIMEI;

} else {
G.editor.putString("IMEA_KEY_APP", serialIMEI);
G.IMEI = serialIMEI;
}

G.editor.putString("UUID_KEY_APP", UUID);
G.UUID = UUID;
G.editor.putBoolean("FIRST_TIME", false);
G.editor.commit();
} else {
G.IMEI = G.preferences.getString("IMEA_KEY_APP", null);
G.UUID = G.preferences.getString("UUID_KEY_APP", null);
G.editor.commit();
}
0 0
اینم بگم که این کد فقط زمان نصب اجرا میشه و برای دفعه های بعد از روی preferendes میخونه و البته این ساختار تولیدی توسط سرور چک میشه و بعد عملیات درخواستی اجرا میشه (8 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .