khaled_prg

نقاش حول أفضل طريقة للتعامل مع الـ Encryption Key

29 ردود في هذا الموضوع

السلام عليكم

 

أعمل الآن على تطبيق Desktop بالجافا يسمح للمستخدم بتسيير و إدارة كلمات المرور (تماما مثل KeePass) أستخدم قاعدة بيانات SQLite لتخزين الـ passwords، هذه الأخيرة يتم تشفيرها قبل تخزينها في الـ DB.

للولوج إلى التطبيق، يقوم المستخدم بإدخال password master الذي من خلاله أقوم بتوليد مفتاح التشفير AES-256-CBC.

سؤالي هو : كيف أتأكد من صحة الـ password master أثناء عملية الـ authentication ؟

 

 

 

تحياتي.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

عادة اقوم بتخزين مفتاح تشفير master password في البرنامج في مكان يصعب الوصول إليه في حال قام أحدهم بعمل هندسة عكسية هذه طريقة ربما تنفعني في برامج مصنوعة بالدالفي أو لازريس حيث يصعب عكس الكود ولكن في الجافا فهو سهل بسيط

 

يوجد طريقة أخرى وهي استعمال الهاش إما md5 أو SHA

هذه الطريقة آمنة حتى ولو وصل أحدهم إلى الهاش فهو لا يمكن عكسه

 

بالتوفيق

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أهلا أبو عبد البر +1

 

عادة اقوم بتخزين مفتاح تشفير master password في البرنامج في مكان يصعب الوصول إليه

 

تقوم بتخزينه في البرنامج !! كيف ؟

 

 

يوجد طريقة أخرى وهي استعمال الهاش إما md5 أو SHA

هذه الطريقة آمنة حتى ولو وصل أحدهم إلى الهاش فهو لا يمكن عكسه

 

إذا كنت تتحدث عن الهاش الطبيعي (يعني بدون salt) فعملية كسره بسيطة جداً إذا كانت قاعدة البيانات embedded و ليست client-server (كما هو الحال هنا)، كل ما على الـ hacker هو تغيير الهاش و إدخال كلمة المرور الموافقة للهاش الجديد.

إذا كنت تتحدث عن الـ salted hashes فالصعوبة تكمن في كيفية التحقق من الـ encryption key.

تم تعديل بواسطه khaled_prg
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

 

إذا كنت تتحدث عن الهاش الطبيعي (يعني بدون salt) فعملية كسره بسيطة جداً إذا كانت قاعدة البيانات embedded و ليست client-server (كما هو الحال هنا)، كل ما على الـ hacker هو تغيير الهاش و إدخال كلمة المرور الموافقة للهاش الجديد.

هذا إذا كان الهكر يعرف دالة الهاش التي استخدمتها ولكن إذا لم يعرفها فكيف سيغيره ، إليك مثالا للتوضيح

 

لتكن هذه دالة الهاش بلغة الجافا

private String hash(String password)    {                return SHA-3(md5(SHA-3(md5(SHA−3(password)))));            }

فالهكر لا يعرف كيف يضع هاش جديدا إلا إذا عرف طريقة التشفير

تم تعديل بواسطه أحمد أبو عبد البر
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

في هذه الحالة، هل أنت متأكد أن علاقة الـ composition بين الـ bijective functions تُولّد بالضرورة دالة bijective ؟؟

تم تعديل بواسطه khaled_prg
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

لم أفهم قصدك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ما هي نسبة حدوث الـ collision في الدالة السابقة ؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • لا يمكنني البرهنة على ذلك رياضيا ولكن أنا على يقين جازم أن لن يحدث أي تصادم بين الهاشات الناتجة عن هذه الدالة
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ok, je vois, je pose ma question autrement : quelle est la probabilité de casser ce hash en utilisant une attaque par force brute ou un dictionnaire de données ?l


0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

هذا يعتمد على مدى تعقيد كلمة السر فكلما كانت أكثر تعقيدا كانت احتمالات brute force أكثر

وفي تعقيد مثل هذا [email protected]"#Opôjvhytg41UH"& سيكون احتمال وصول الهكر إلى كلمة السر واحد من ملايير ملايير ملايير ....

 

 

 

 

في الأخير يجب أن تعرف أن الهاش ما هو إلا مُصَعِّب  لعملية الاقتحام العنيف فقد تصل مدة التجريب سنين ولكن تنبه... في وجود السوبر كومبيوتر لدى الحكومات الكبرى  أصبح الكسر أسرع  بملايين ملايين  المرات

تم تعديل بواسطه أحمد أبو عبد البر
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

+1

طيب، لنفترض أن المستخدم أدخل كلمة المرور و تم التأكد منها بنجاح :)

السؤال الموالي الذي يطرح نفسه بإلحاح هو كيف يُمكنني التأكد من أن ملف قاعدة البيانات لم يتعرض للتعديل من قبل أحدهم ؟

 

il s'agit de l'intégrité de la base de données, je ne sais pas comment on l'appelle en arabe

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مرة أخرى استعمل  hash  لملف قاعدة البيانات لإنشاء بصمة إلكترونية

 

كلما تقوم بتعديل على قاعدة البيانات هشهش الملف واحفظ الهاش في مكان آمن حتى لا تصل إليه أيدي التخريب والعبث

ثم كلما تسجل دخولك إلى البرنامج هشهش ملف قاعدة البيانات ثم قارن الهاش الناتج بالهاش المحفوظ عندك في مكان آمن

 

على العموم يوجد طريقة أخرى لتأمين embedded database وذلك بإنشاء هارد ديسك افتراضي مشفر ، يوجد أدوات وبرامج تعمل لك ما تريد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

 

يوجد طريقة أخرى لتأمين embedded database وذلك بإنشاء هارد ديسك افتراضي مشفر

هل من تفصيل ؟ علما أنني أريد حلولا تعتمد على تغيير الكود فقط، بدون استخدام أدوات خارجية.

 

 

قارن الهاش الناتج بالهاش المحفوظ عندك في مكان آمن

و أين هو هذا المكان الآمن ؟؟

تم تعديل بواسطه khaled_prg
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

 

علما أنني أريد حلولا تعتمد على تغيير الكود فقط، بدون استخدام أدوات خارجية

إذاً انس الأمر

 

 

و أين هو هذا المكان الآمن ؟؟

 

 

لو كنت على اللينكس فسيكون الجواب سهلا واما على نظام النوافذ فالمكان الآمن سيكون بالتاكيد خارج جهاز الكمبيوتر وليكن مثلا فلاش ديسك

تم تعديل بواسطه أحمد أبو عبد البر
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

 

اما على نظام النوافذ فالمكان الآمن سيكون بالتاكيد خارج جهاز الكمبيوتر وليكن مثلا فلاش ديسك

En faisant ceci, l'application perdrait absolument sa portabilité puisque si l'utilisateur voudrait accéder à sa base, il devrait avoir une clé USB !!l

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ملاحظة : استعمل اللغة العربية ما استطعت ^_^

 

انا أعطيتك مثالا إذ يمكن ان تخزن ملف الهاش في السحابة كمثال آخر، المهم دبر حالك

 

وعلى كل حال هذا الملف ليس اساسي في عمل البرنامج وإنما هو للتأكد فقط من أن قاعدة البيانات لم تصلها أيدي العبث

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

+1

أشكرك على المتابعة.

 

بالنسبة لتخزين الهاش، برنامج KeePass مثلا يُمكنه معرفة ما إذا كانت قاعدة البيانات قد تعرضت للتعديل أم لا دون أن يطلب منك تخزين الهاش.

هل لديك و لو فكرة تخمينية عن التقنية التي يستخدمها للتحقق من سلامة و تكامل قاعدة البيانات ؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

معرفة هل هذا الشيء تم تعديله أم لا   ،  لا تتم إلا بالمقارنة مع صفة الشيء من قبل كيف كانت ...هذا أمر منطقي

 

أنت لو رايت صديقا لك وقلت له قد تغيرت فذلك لأنك قارنت صورته الآن بصورته المخزنة في دماغك فوجدت التغيير

 

الآن هذا البرنامج لم أطلع على كيفية عمله ولكن هو بالتأكيد سيستعمل طريقة الحفظ والمقارنة لكي يعرف هل حدث تغيير على قاعدة البيانات ، ربما لم يطلب منك ذلك ولكن هو بالتأكيد يقوم بذلك بطرقة خفية

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ok, merci pour l'aide


0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مرحبا وأهلا وسهلا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

Oui, j'ai déjà vu SQLCipher, il représente justement une bonne solution pour le cryptage des bases de données mais malheureusement, il n’existe pas un JDBC pour JavaSE


0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أنا أتحدث عن JDBC لـ SQLCipher و ليس SQLIte فقط.

حسب ما قرأت في موقع stackoverflow فإنه لا توجد حتى الآن نسخة مجانية : JDBC for SQLCipher

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

هذه النسخة من JDBC تدعم الاتصال ب SQLCipher

 

انظر إلى  ملف الاختبار في نفس المشروع https://github.com/sjlombardo/sqlitejdbc/blob/master/src/test/ConnectionTest.java

 

انظر إلى القطعة منه

 @Test public void sqlCipherTest() throws SQLException {File testdb = new File("cipher.db");if (testdb.exists()) testdb.delete();Connection conn = DriverManager.getConnection("jdbc:sqlite:cipher.db");PreparedStatement prep = conn.prepareStatement("pragma key='123';");prep.executeUpdate();prep.close();prep = conn.prepareStatement("create table foo (bar integer);");prep.executeUpdate();prep.close();prep = conn.prepareStatement("insert into foo (bar) values (1);");prep.executeUpdate();prep.close();conn.close();conn = DriverManager.getConnection("jdbc:sqlite:cipher.db");ResultSet rs = null;try {prep = conn.prepareStatement("select bar from foo");rs = prep.executeQuery();assertTrue(false);}catch (java.sql.SQLException e){prep.close();assertTrue(true);}conn = DriverManager.getConnection("jdbc:sqlite:cipher.db");prep = conn.prepareStatement("pragma key='123';");prep.executeUpdate();prep.close();prep = conn.prepareStatement("select bar from foo");rs = prep.executeQuery();assertTrue(rs.next());assertEquals(rs.getInt(1), 1);prep.close();conn.close();}
تم تعديل بواسطه أحمد أبو عبد البر
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .