هل يمكن تشفير Derby / Javadb _really_ مع Triple des بدلاً من (عادي) des؟

StackOverflow https://stackoverflow.com/questions/1925134

سؤال

يبدو أنه مربك Triple-Des (> 128 بت) مع DES (64 بت). أحاول تشفير قاعدة بيانات Derby مع Triple DES (أو DESEDE) باستخدام Java 1.5

لقد وجدت هذا رسالة منتدى المناقشة حول مشكلة مع JDK 1.5 عن طريق الصدفة وفحصها للتأكد من أنها كانت تستخدم بالفعل DESEDE وليس DES عادي. عندما أنشأت قاعدة البيانات مع عنوان URL Triple DES (168 بت)

jdbc:derby:MySecureDB;dataEncryption=true;encryptionAlgorithm=DESede/CBC/NoPadding;bootPassword=$ecureC@deCanBr@kE0074242

كنت لا أزال قادرًا على فتحه والوصول إليه بعنوان URL (عادي) DES (64 بت)

jdbc:derby:MySecureDB;dataEncryption=true;encryptionAlgorithm=DES/CBC/NoPadding;bootPassword=$ecureC@deCanBr@kE0074242

هذا ليس السلوك الذي أتوقعه !!! لا ينبغي أن أكون قادرًا على فتحه مع خوارزمية التشفير الخاطئة. كيف يمكنني التأكد من تشفيرها حقًا مع خوارزمية (> 128 بت)؟

يبدو أن ديربي يستخدم الوظيفة الصحيحة لـ Java 1.5 المذكورة في jcecipherprovider.java. تشير قراءتي للرمز إلى أن Derby لا يتعامل مع Triple des على أنه مختلف عن DES Plain ... هل يمكنني أن أثق حقًا في أنها تستخدم تشفيرًا قويًا؟

هل كانت مفيدة؟

المحلول

أعتقد أن الوثائق خاطئة ، وأنك لا تحتاج فعليًا إلى تحديد خوارزمية التشفير لاستخدامها عند استخدام خوارزمية غير مقدمة ، حيث يتم تحديد الخوارزمية التي يجب استخدامها في $ derby_home/database/service.propert.

في حالتي ، عندما أنشأت قاعدة بيانات مع معلماتك خدمتي. كانت المحتويات التالية (من بين الإدخالات الأخرى غير ذات الصلة):

log_encrypt_algorithm_version=1
encryptionAlgorithm=DESede/CBC/NoPadding
dataEncryption=true
derby.encryptionBlockSize=8
encryptionKeyLength=168-24
encryptedBootPassword=472b7cc5600605333392dd10a46067d2e2935fd4c350d533-43435
data_encrypt_algorithm_version=1

يمكنك التحقق من أن هذا يتم استخدامه ، عن طريق تغيير الخوارزمية المستخدمة. إذا قمت بتغيير الخوارزمية المحددة في هذا الملف إلى DES ، فلن تتمكن من إعادة تشغيل قاعدة البيانات.

فمثلا:

$ ../bin/ij
ij version 10.4
ij> connect 'jdbc:derby:testdb;create=true;dataEncryption=true;encryptionAlgorithm=Blowfish/ECB/NoPadding;bootPassword=$ecureC@deCanBr@kE0074242';
ij> quit;
$ sed -i .o 's/Blowfish/DES/' testdb/service.properties 
$ ../bin/ij
ij version 10.4
ij> connect 'jdbc:derby:testdb;bootPassword=$ecureC@deCanBr@kE0074242';
ERROR XJ040: Failed to start database 'testdb', see the next exception for details.
ERROR XBM06: Startup failed. An encrypted database cannot be accessed without the correct boot password.  
ij> quit;
$ sed -i .o 's/DES/Blowfish/' testdb/service.properties 
$ ../bin/ij
ij version 10.4
ij> connect 'jdbc:derby:testdb;bootPassword=$ecureC@deCanBr@kE0074242';
ij> quit;
$ 

نصائح أخرى

وفق العمل مع التشفير من دليل مطور Java DB ، يبدو عنوان URL الأول جيدًا تشفير قاعدة بيانات على الإنشاء (لأنه يحدد dataEncryption=true) ويجب أن يكون قد ولدت مفتاح تشفير 168 بت.

الآن ، لا يزال وفقًا للتوثيق ، لا أعتقد أنه يجب عليك استخدامه dataEncryption=true متى تشغيل قاعدة بيانات مشفرة. ما أفهمه هو أنك تحتاج فقط إلى استخدامها bootPassword و encryptionAlgorithm.

أعترف أنني لم أختبر هذا ، وفي الواقع ، أتساءل حقًا عما يحدث بالضبط:

  • إذا لم تحدد dataEncryption واستخدم الخطأ encryptionAlgorithm في عنوان URL الثاني.
  • عندما تحدد dataEncryption=true واستخدام آخر encryptionAlgorithm (هل يعيد إنشاء قاعدة بيانات مشفرة؟).

الوثائق غير واضحة حول ذلك.

أعتقد أن معلمة التشفير الأهمية لا تهم إلا عند قيامك بالتشفير أولاً (أي ، عندما تقوم أولاً بإنشاء قاعدة بيانات مشفرة ، أو عندما تقوم أولاً بتشفير قاعدة بيانات غير مشفقة).

بمجرد تشفير قاعدة البيانات ، من ذلك الحين ، تحتاج فقط إلى تحديد BootPassword. يعرف ديربي بالفعل ما هي خوارزمية التشفير التي تم استخدامها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top