কোনও অ্যাপ্লিকেশন মোতায়েনের সময় কীভাবে "আনলিমিটেড স্ট্রেনথ" জেসিই পলিসি ফাইলগুলি ইনস্টল করবেন?


169

আমার কাছে এমন একটি অ্যাপ রয়েছে যা 256-বিট AES এনক্রিপশন ব্যবহার করে যা জাভা বাক্সের বাইরে সমর্থিত নয়। আমি এটি সঠিকভাবে কাজ করতে পেতে জানি সুরক্ষা ফোল্ডারে আমি জেসিই সীমাহীন শক্তি জারগুলি ইনস্টল করি। এটি বিকাশকারী হিসাবে আমার পক্ষে ঠিক আছে, আমি সেগুলি ইনস্টল করতে পারি।

আমার প্রশ্নটি যেহেতু এই অ্যাপটি বিতরণ করা হবে, শেষ ব্যবহারকারীরা সম্ভবত এই নীতিমালা ফাইল ইনস্টল করবেন না। অ্যাপ্লিকেশনটির কার্যকারিতা তৈরি করতে শেষ ব্যবহারকারীদের এগুলি ডাউনলোড করা কোনও আকর্ষণীয় সমাধান নয়।

শেষ ব্যবহারকারী মেশিনে ফাইলগুলি ওভাররাইট না করে আমার অ্যাপটি চালানোর কোনও উপায় আছে কি? কোনও তৃতীয় পক্ষের সফ্টওয়্যার যা পলিসি ফাইল ইনস্টল না করে এটিকে পরিচালনা করতে পারে? অথবা এই নীতিমালার ফাইলগুলিকে কেবল কোনও জেআর থেকে রেফারেন্স করার কোনও উপায়?


1
এখানে একবার দেখুন: docs.oracle.com/javase/1.5.0/docs/guide/security/jce/…
পেটে বি


11
আমার সন্দেহ হয় সান / ওরাকল অভিপ্রায়টি ছিল যে ক্লায়েন্টটি একটি কম-নিরাপদ সাইফার ব্যবহার করবে যাতে এনএসএ সংযোগটি স্নুপ করতে পারে। আমি রসিকতা করছি না বা ভৌতিক হয়ে যাচ্ছি না, তবে ক্রিপ্টোগ্রাফিটিকে একটি অস্ত্র হিসাবে বিবেচনা করা হয় এবং এনক্রিপশন ভাগ করে নেওয়ার ক্ষেত্রে রফতানি নিষেধাজ্ঞা রয়েছে
টানা স্লেজগাড়ির

উত্তর:


175

এই সমস্যাটির জন্য বেশ কয়েকটি সাধারণভাবে উদ্ধৃত সমাধান রয়েছে। দুর্ভাগ্যক্রমে এগুলির উভয়ই সম্পূর্ণ সন্তোষজনক নয়:

  • সীমাহীন শক্তি নীতি ফাইল ইনস্টল করুন । যদিও এটি সম্ভবত আপনার বিকাশের ওয়ার্কস্টেশনের সঠিক সমাধান, এটি অ-প্রযুক্তি ব্যবহারকারীদের প্রতিটি কম্পিউটারে ফাইল ইনস্টল করার জন্য এটি দ্রুত একটি বড় ঝামেলা হয়ে দাঁড়ায় (রোডব্লক না হলে)। নেই কোন উপায় আপনার প্রোগ্রাম ফাইল বিতরণ করার; এগুলি অবশ্যই জেআরই ডিরেক্টরিতে ইনস্টল করা উচিত (যা অনুমতিগুলির কারণে এমনকি পঠনযোগ্যও হতে পারে)।
  • জেসিই এপিআই এড়িয়ে যান এবং বুন্সি ক্যাসলের মতো আরও একটি ক্রিপ্টোগ্রাফি লাইব্রেরি ব্যবহার করুন । এই পদ্ধতির জন্য অতিরিক্ত 1MB গ্রন্থাগার প্রয়োজন, যা প্রয়োগের উপর নির্ভর করে একটি উল্লেখযোগ্য বোঝা হতে পারে। এটি স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত কার্যকারিতার সদৃশ করতে বোকা বোধ করে। স্পষ্টতই, এপিআইও সাধারণ জেসিই ইন্টারফেসের থেকে সম্পূর্ণ আলাদা। (বিসি একটি জেসিই সরবরাহকারী বাস্তবায়ন করে, তবে এটি কার্যকর হয় না কারণ বাস্তবায়নের হাতে দেওয়ার আগে কী শক্তি সীমাবদ্ধতা প্রয়োগ করা হয়)) এই সমাধানটি আপনাকে 256-বিট টিএলএস (এসএসএল) সাইফার স্যুট ব্যবহার করতে দেয় না কারণ স্ট্যান্ডার্ড টিএলএস লাইব্রেরিগুলি কোনও সীমাবদ্ধতা নির্ধারণের জন্য অভ্যন্তরীণভাবে জেসিইকে কল করে।

কিন্তু তারপরে প্রতিবিম্ব আছে। প্রতিবিম্ব ব্যবহার করে আপনি করতে পারবেন না এমন কিছু আছে কি?

private static void removeCryptographyRestrictions() {
    if (!isRestrictedCryptography()) {
        logger.fine("Cryptography restrictions removal not needed");
        return;
    }
    try {
        /*
         * Do the following, but with reflection to bypass access checks:
         *
         * JceSecurity.isRestricted = false;
         * JceSecurity.defaultPolicy.perms.clear();
         * JceSecurity.defaultPolicy.add(CryptoAllPermission.INSTANCE);
         */
        final Class<?> jceSecurity = Class.forName("javax.crypto.JceSecurity");
        final Class<?> cryptoPermissions = Class.forName("javax.crypto.CryptoPermissions");
        final Class<?> cryptoAllPermission = Class.forName("javax.crypto.CryptoAllPermission");

        final Field isRestrictedField = jceSecurity.getDeclaredField("isRestricted");
        isRestrictedField.setAccessible(true);
        final Field modifiersField = Field.class.getDeclaredField("modifiers");
        modifiersField.setAccessible(true);
        modifiersField.setInt(isRestrictedField, isRestrictedField.getModifiers() & ~Modifier.FINAL);
        isRestrictedField.set(null, false);

        final Field defaultPolicyField = jceSecurity.getDeclaredField("defaultPolicy");
        defaultPolicyField.setAccessible(true);
        final PermissionCollection defaultPolicy = (PermissionCollection) defaultPolicyField.get(null);

        final Field perms = cryptoPermissions.getDeclaredField("perms");
        perms.setAccessible(true);
        ((Map<?, ?>) perms.get(defaultPolicy)).clear();

        final Field instance = cryptoAllPermission.getDeclaredField("INSTANCE");
        instance.setAccessible(true);
        defaultPolicy.add((Permission) instance.get(null));

        logger.fine("Successfully removed cryptography restrictions");
    } catch (final Exception e) {
        logger.log(Level.WARNING, "Failed to remove cryptography restrictions", e);
    }
}

private static boolean isRestrictedCryptography() {
    // This matches Oracle Java 7 and 8, but not Java 9 or OpenJDK.
    final String name = System.getProperty("java.runtime.name");
    final String ver = System.getProperty("java.version");
    return name != null && name.equals("Java(TM) SE Runtime Environment")
            && ver != null && (ver.startsWith("1.7") || ver.startsWith("1.8"));
}

removeCryptographyRestrictions()কোনও স্ট্রিটোগ্রাফিক ক্রিয়াকলাপ সম্পাদনের আগে কেবল কোনও স্ট্যাটিক ইনিশিয়ালাইজার বা এ জাতীয় কল করুন ।

JceSecurity.isRestricted = falseঅংশ যে সব সরাসরি 256-বিট সাইফারগুলির ব্যবহার করা প্রয়োজন হয়; তবে, অন্য দুটি অপারেশন ছাড়াই, Cipher.getMaxAllowedKeyLength()এখনও 128 প্রতিবেদন করা থাকবে, এবং 256-বিট টিএলএস সাইফার স্যুট কাজ করবে না।

এই কোডটি ওরাকল জাভা 7 এবং 8 এ কাজ করে এবং স্বয়ংক্রিয়ভাবে জাভা 9 এবং ওপেনজেডিকে প্রক্রিয়াটি এড়িয়ে যায় যেখানে এটির প্রয়োজন নেই। সর্বোপরি কুৎসিত হ্যাক হওয়ার কারণে এটি অন্যান্য বিক্রেতাদের ভিএমগুলিতে সম্ভবত কাজ করে না।

এটি ওরাকল জাভা 6 তেও কাজ করে না, কারণ ব্যক্তিগত জেসিই ক্লাসগুলি সেখানে আবদ্ধ। আপত্তি যদিও সংস্করণ থেকে সংস্করণে পরিবর্তিত হয় না, তাই জাভা 6 সমর্থন করা এখনও প্রযুক্তিগতভাবে সম্ভব।


23
প্রতিবিম্ব সমাধানটি জাভা লাইসেন্স চুক্তিকে লঙ্ঘন করতে পারে : "এফ জাভা প্রযুক্তিগত নিষেধাজ্ঞাগুলি ... আপনি ... জাভা ',' জাভ্যাক্স 'হিসাবে চিহ্নিত কোনওভাবেই ... শ্রেণি, ইন্টারফেস বা উপ-প্যাকেজের আচরণ পরিবর্তন করতে পারবেন না may , 'সূর্য', 'ওরাকল' বা অনুরূপ সম্মেলন ... "
এম ডুডলি

14
@ এমডুডলি হতে পারে যদি আপনার কোনও উদ্বেগ থাকে তবে এই কোডের এই টুকরা সম্বলিত কোনও পণ্য শিপিংয়ের আগে একজন আইনজীবীর সাথে চেক করুন।
ntoskrnl

3
@ পেবডি আপনার প্রোগ্রামের সাথে একটি 100 এমবি জেআরই অন্তর্ভুক্ত করা অবশ্যই কিছু ক্ষেত্রে অবশ্যই একটি বিকল্প। তবে যদি তা না হয় তবে ব্যবহারকারীরা পলিসি ফাইলগুলি ম্যানুয়ালি ইনস্টল করতে হবে, এমনকি যদি আপনি সেগুলি আপনার প্রোগ্রামের সাথে অন্তর্ভুক্ত করেন (ফাইলের অনুমতি যেমন বিভিন্ন কারণে)। আমার অভিজ্ঞতায়, অনেক ব্যবহারকারী তার পক্ষে সক্ষম নন।
ntoskrnl

8
দেখে মনে হচ্ছে প্রতিবিম্ব সমাধানটি কেবল 1.8.0_112 এ কাজ করা বন্ধ করে দিয়েছে। এটি 1.8.0_111 এ কাজ করে তবে 112 নয়।
জন এল

3
@ জনল আমি একটি অ্যাপ্লিকেশনটিতে এটি ব্যবহার করি। সঙ্গে কষ্ট চালানোর পর final8u111 মাঠে, আমি এটা পরিবর্তিত তাই এটি চূড়ান্ত ক্ষেত্র পরিবর্তন করতে পারেন এই নিম্নলিখিত, উত্তর । ফলাফলটি ntoskrnl এর নতুন সংস্করণ হিসাবে প্রায় একই, আমি যে modifiersFieldহিসাবে ঘোষণা করি নি final। আমার একজন ব্যবহারকারী রিপোর্ট করেছেন যে এটি 8u112 তেও কাজ করে।
আরজান

87

এটি এখন জাভা 9 এর জন্য বা জাভা 6, 7 বা 8 এর সাম্প্রতিক প্রকাশের জন্য আর দরকার নেই ! অবশেষে! :)

প্রতি JDK-8170157 , সীমাহীন ক্রিপ্টোগ্রাফিক নীতি এখন ডিফল্ট ভাবে সক্রিয় করা হয়।

JIRA ইস্যু থেকে নির্দিষ্ট সংস্করণ:

  • জাভা 9 (10, 11, ইত্যাদি ..): কোনও অফিসিয়াল রিলিজ!
  • জাভা 8u161 বা তার পরে ( এখন উপলভ্য )
  • জাভা 7u171 বা তার পরে (কেবল 'আমার ওরাকল সাপোর্ট' এর মাধ্যমে উপলব্ধ)
  • জাভা 6u181 বা তার পরে (কেবল 'আমার ওরাকল সাপোর্ট' এর মাধ্যমে উপলব্ধ)

মনে রাখবেন যে কোনও অদ্ভুত কারণে জাভা 9-তে পুরানো আচরণের প্রয়োজন হলে এটি ব্যবহার করে সেট করা যেতে পারে:

Security.setProperty("crypto.policy", "limited");

4
আসলে, এই নীতিটি ডিফল্ট, তাই জাভা 9 এ কোনও ক্রিয়াকলাপের প্রয়োজন নেই!
ntoskrnl

2018/01/14 পর্যন্ত (সর্বশেষ ওরাকল জেডি কে 8u151 / 152) এটি জাভা 8 এ ডিফল্টরূপে এখনও সক্ষম নয়, এই উত্তরটি মূলত লেখার এক বছরেরও বেশি পরে ... তবে java.com/en/jre অনুসারে -jdk-cryptoroadmap.html এটি 2018/01/16 এ জিএ-এর উদ্দেশ্যে করা হয়েছে
অ্যালেক্স

আমার ক্ষেত্রে এবং আমার জন্য এই সাইটে একটি চিহ্ন পাওয়ার জন্য: ssllabs.com/ssltest ... আমাকে এটি এইভাবে সেট করতে হবে: সিকিউরিটি.সেটপ্রোপার্টি ("ক্রিপ্টো.পলিসি", "সীমাহীন"); তারপর ... 256-ভিত্তিক আলগোরিদিম সঙ্গে আমার applications.properties সেট server.ssl.ciphers এই প্রবন্ধে উল্লিখিত -> weakdh.org/sysadmin.html
Artanis Zeratul

ওপেনজেডকে 8-ইনস্টলেশনগুলির জন্য প্রাসঙ্গিক। দেখুন: স্ট্যাকওভার্লো-আর্টিকেল: জেসিই নীতিটি কি ওপেনজেডকে 8 দিয়ে বান্ডিল করা হয়েছে?
লিওলে

22

এখানে সমাধান রয়েছে: http://middlesphere-1.blogspot.ru/2014/06/this-code-allows-to-break-limit-if.html

//this code allows to break limit if client jdk/jre has no unlimited policy files for JCE.
//it should be run once. So this static section is always execute during the class loading process.
//this code is useful when working with Bouncycastle library.
static {
    try {
        Field field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted");
        field.setAccessible(true);
        field.set(null, java.lang.Boolean.FALSE);
    } catch (Exception ex) {
    }
}

এটি "ডিফল্টপলিসি" অংশ ব্যতীত আমার মতো একই সমাধান। ব্লগ পোস্ট আমার উত্তর পরে তারিখ।
ntoskrnl

1
তবে এই কি সঠিক জিনিস? রিয়েল টাইমে এই কোডটি কি অ্যাপ্লিকেশন সুরক্ষাকে চ্যালেঞ্জ করতে পারে? আমি নিশ্চিত না যে দয়া করে এর প্রভাব বুঝতে আমাকে সহায়তা করুন।
ডিশ

1
এটি চালানোর পরে আমি এই ত্রুটিটি পেয়েছি:java.security.InvalidKeyException: Wrong algorithm: AES or Rijndael required
অ্যান্ডি

3
জাভা 8 বিল্ড 111 হিসাবে, isRestrictedক্ষেত্রটি চূড়ান্ত হয়ে যাওয়ার সাথে সাথে এই সমাধানটি অপর্যাপ্ত হবে ( বাগস.ওপেনজডক.জভা . net / ব্রাউজ / জেডিকে-8149417 )। @ এনটোসক্র্নেলের উত্তরটি "চূড়ান্ত" সংশোধনকারীকে যে কোনও সম্ভাব্য অন্তর্ভুক্তির যত্ন নেয়। জাভা লাইসেন্স চুক্তিতে এমডুডলির মন্তব্যটি এখনও প্রযোজ্য।
এমপিলেটিয়ার


13

জেডিকে 8u102 অনুসারে, প্রতিচ্ছবিগুলির উপর নির্ভর করে পোস্ট করা সমাধানগুলি আর কাজ করবে না: এই সমাধানগুলি যে ক্ষেত্রটি সেট করেছে তা এখন final( https://bugs.openjdk.java.net/browse/JDK-8149417 )।

দেখে মনে হচ্ছে এটি আবার (ক) বাউন্সি ক্যাসল ব্যবহার করে, বা (খ) জেসিই নীতি ফাইলগুলি ইনস্টল করে।


7
আপনি সর্বদা আরও প্রতিবিম্ব স্ট্যাকওভারফ্লো.com
ইউনিভার্সাল বিদ্যুৎ

হ্যাঁ, @ এমডুডলির সমাধানটি এখনও isRestrictedক্ষেত্রের জন্য কাজ করবে , কারণ এটি একটি "চূড়ান্ত" সংশোধনকারীটির সম্ভাব্য সংযোজনের যত্ন নেয়।
এমপিলেটিয়ার

1
নতুন প্রকাশ JDK 8u151 এর "ক্রিপ্টো নীতি নিয়ন্ত্রণের জন্য নতুন সুরক্ষা সম্পত্তি" রয়েছে। নীচের লাইন: "#" p সুরক্ষা ol জাভা.সিকিউরিটি "" # ক্রিপ্টো.পোলসি = সীমাহীন "লাইনটি থেকে" # "সরান: oracle.com/technetwork/java/javase/8u151-relnotes-3850493.html
গোলার্ধে

8

বিকল্প ক্রিপ্টোগ্রাফি লাইব্রেরির জন্য, বুন্সি ক্যাসলটি দেখুন । এটিতে এইএস এবং প্রচুর যুক্ত কার্যকারিতা রয়েছে। এটি একটি উদার ওপেন সোর্স লাইব্রেরি। এটি কাজ করার জন্য আপনাকে লাইটওয়েট, মালিকানাধীন বাউন্সি ক্যাসল API ব্যবহার করতে হবে।


19
এগুলি দুর্দান্ত ক্রিপ্টো সরবরাহকারী, তবে বড় কীগুলি নিয়ে কাজ করার জন্য এখনও সীমাহীন শক্তি জেসিই ফাইল দরকার file
জন মেঘার

16
আপনি যদি সরাসরি বাউন্সি ক্যাসল API ব্যবহার করেন তবে আপনার সীমাহীন শক্তি ফাইলগুলির প্রয়োজন হবে না।
লাজ

4

আপনি পদ্ধতি ব্যবহার করতে পারে

javax.crypto.Cipher.getMaxAllowedKeyLength(String transformation)

উপলব্ধ কী দৈর্ঘ্যের পরীক্ষা করতে, এটি ব্যবহার করুন এবং ব্যবহারকারীকে কী চলছে তা অবহিত করুন। নীতিমালা ফাইল ইনস্টল না হওয়ার কারণে আপনার অ্যাপ্লিকেশনটি 128 বিট কী-তে ফিরে পড়ছে এমন উদাহরণস্বরূপ thing সুরক্ষা সচেতন ব্যবহারকারীরা নীতি ফাইলগুলি ইনস্টল করবেন, অন্যরা দুর্বল কীগুলি ব্যবহার করা চালিয়ে যাবেন।


3

আমাদের অ্যাপ্লিকেশনটির জন্য, আমাদের কাছে একটি ক্লায়েন্ট সার্ভার আর্কিটেকচার ছিল এবং আমরা কেবল সার্ভার স্তরে ডিক্রিপ্টিং / এনক্রিপ্ট করার অনুমতি দিয়েছিলাম। সুতরাং জেসিই ফাইলগুলি কেবল সেখানে প্রয়োজন।

আমাদের আর একটি সমস্যা হয়েছিল যেখানে আমাদের ক্লায়েন্ট মেশিনগুলিতে একটি সুরক্ষা জার আপডেট করার দরকার ছিল, জেএনএলপি এর মাধ্যমে, এটি লাইব্রেরিগুলিকে এবং জেভিএমকে ${java.home}/lib/security/প্রথমবারে ওভাররাইট করে ।

এটি কাজ করে।


2

এখানে ntoskrnl উত্তরের একটি আপডেট সংস্করণ । এটিতে মন্তব্যে উল্লিখিত আরজনের মতো চূড়ান্ত সংশোধককে সরাতে একটি ফাংশন রয়েছে ।

এই সংস্করণটি JRE 8u111 বা আরও নতুনর সাথে কাজ করে।

private static void removeCryptographyRestrictions() {
    if (!isRestrictedCryptography()) {
        return;
    }
    try {
        /*
         * Do the following, but with reflection to bypass access checks:
         * 
         * JceSecurity.isRestricted = false; JceSecurity.defaultPolicy.perms.clear();
         * JceSecurity.defaultPolicy.add(CryptoAllPermission.INSTANCE);
         */
        final Class<?> jceSecurity = Class.forName("javax.crypto.JceSecurity");
        final Class<?> cryptoPermissions = Class.forName("javax.crypto.CryptoPermissions");
        final Class<?> cryptoAllPermission = Class.forName("javax.crypto.CryptoAllPermission");

        Field isRestrictedField = jceSecurity.getDeclaredField("isRestricted");
        isRestrictedField.setAccessible(true);
        setFinalStatic(isRestrictedField, true);
        isRestrictedField.set(null, false);

        final Field defaultPolicyField = jceSecurity.getDeclaredField("defaultPolicy");
        defaultPolicyField.setAccessible(true);
        final PermissionCollection defaultPolicy = (PermissionCollection) defaultPolicyField.get(null);

        final Field perms = cryptoPermissions.getDeclaredField("perms");
        perms.setAccessible(true);
        ((Map<?, ?>) perms.get(defaultPolicy)).clear();

        final Field instance = cryptoAllPermission.getDeclaredField("INSTANCE");
        instance.setAccessible(true);
        defaultPolicy.add((Permission) instance.get(null));
    }
    catch (final Exception e) {
        e.printStackTrace();
    }
}

static void setFinalStatic(Field field, Object newValue) throws Exception {
      field.setAccessible(true);

      Field modifiersField = Field.class.getDeclaredField("modifiers");
      modifiersField.setAccessible(true);
      modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

      field.set(null, newValue);
   }

private static boolean isRestrictedCryptography() {
    // This simply matches the Oracle JRE, but not OpenJDK.
    return "Java(TM) SE Runtime Environment".equals(System.getProperty("java.runtime.name"));
}

এটি দুর্দান্তভাবে কাজ করে তবে লাইনটি ((Map<?, ?>) perms.get(defaultPolicy)).clear();একটি সংকলক ত্রুটি দেয়। মন্তব্য করা তার কার্যকারিতা প্রভাবিত করে না বলে মনে হচ্ছে। এই লাইন কি প্রয়োজনীয়?
Andreas Unterweger

2

এখানে বাস্তবিক , এসএলএফ 4 জে লগিং এবং অ্যাপ্লিকেশন বুটস্ট্র্যাপ থেকে সিঙ্গলটন ইনিশিয়ালাইজেশন সমর্থন isRestrictedCryptographyকরে যাচাই করে বৈশিষ্ট্যযুক্ত @ এনটিস্ক্রনল এর কোডের একটি পরিবর্তিত সংস্করণ এখানে রয়েছে :Cipher.getMaxAllowedKeyLength

static {
    UnlimitedKeyStrengthJurisdictionPolicy.ensure();
}

@ ক্র্যানফিনের উত্তর পূর্বাভাস হিসাবে জাভা 8u162 এ যখন সীমাহীন নীতি ডিফল্টরূপে উপলব্ধ হয় তখন এই কোডটি সঠিকভাবে প্রতিবিম্বের সাথে ম্যাংলিং বন্ধ করে দেবে।


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.crypto.Cipher;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.security.NoSuchAlgorithmException;
import java.security.Permission;
import java.security.PermissionCollection;
import java.util.Map;

// /programming/1179672/how-to-avoid-installing-unlimited-strength-jce-policy-files-when-deploying-an
public class UnlimitedKeyStrengthJurisdictionPolicy {

    private static final Logger log = LoggerFactory.getLogger(UnlimitedKeyStrengthJurisdictionPolicy.class);

    private static boolean isRestrictedCryptography() throws NoSuchAlgorithmException {
        return Cipher.getMaxAllowedKeyLength("AES/ECB/NoPadding") <= 128;
    }

    private static void removeCryptographyRestrictions() {
        try {
            if (!isRestrictedCryptography()) {
                log.debug("Cryptography restrictions removal not needed");
                return;
            }
            /*
             * Do the following, but with reflection to bypass access checks:
             *
             * JceSecurity.isRestricted = false;
             * JceSecurity.defaultPolicy.perms.clear();
             * JceSecurity.defaultPolicy.add(CryptoAllPermission.INSTANCE);
             */
            Class<?> jceSecurity = Class.forName("javax.crypto.JceSecurity");
            Class<?> cryptoPermissions = Class.forName("javax.crypto.CryptoPermissions");
            Class<?> cryptoAllPermission = Class.forName("javax.crypto.CryptoAllPermission");

            Field isRestrictedField = jceSecurity.getDeclaredField("isRestricted");
            isRestrictedField.setAccessible(true);
            Field modifiersField = Field.class.getDeclaredField("modifiers");
            modifiersField.setAccessible(true);
            modifiersField.setInt(isRestrictedField, isRestrictedField.getModifiers() & ~Modifier.FINAL);
            isRestrictedField.set(null, false);

            Field defaultPolicyField = jceSecurity.getDeclaredField("defaultPolicy");
            defaultPolicyField.setAccessible(true);
            PermissionCollection defaultPolicy = (PermissionCollection) defaultPolicyField.get(null);

            Field perms = cryptoPermissions.getDeclaredField("perms");
            perms.setAccessible(true);
            ((Map<?, ?>) perms.get(defaultPolicy)).clear();

            Field instance = cryptoAllPermission.getDeclaredField("INSTANCE");
            instance.setAccessible(true);
            defaultPolicy.add((Permission) instance.get(null));

            log.info("Successfully removed cryptography restrictions");
        } catch (Exception e) {
            log.warn("Failed to remove cryptography restrictions", e);
        }
    }

    static {
        removeCryptographyRestrictions();
    }

    public static void ensure() {
        // just force loading of this class
    }
}

-1

আপনার প্রোগ্রামটি ইনস্টল করার সময়, কেবলমাত্র ব্যবহারকারীকে অনুরোধ করুন এবং একটি ডস ব্যাচের স্ক্রিপ্ট বা বাশ শেল স্ক্রিপ্ট ডাউনলোড করুন এবং জেসিইটিকে যথাযথ সিস্টেমের স্থানে অনুলিপি করুন।

সার্ভার ওয়েবসার্চিসের জন্য আমার এটি করতে হবে এবং একটি আনুষ্ঠানিক ইনস্টলারের পরিবর্তে, আমি অ্যাপ্লিকেশনটি চালানোর আগে কেবল সেটআপ করার জন্য স্ক্রিপ্টগুলি সরবরাহ করেছি। সেটআপ স্ক্রিপ্ট না চালানো পর্যন্ত আপনি অ্যাপটিকে চালনাযোগ্য করতে পারবেন। আপনি অ্যাপটিকে জিসিই অনুপস্থিত বলে অভিযোগ করতে পারেন এবং তারপরে অ্যাপটি ডাউনলোড করে পুনরায় চালু করতে বলবেন?


7
" শেষ অ্যাপ্লিকেশন মেশিনে ফাইলগুলি ওভাররাইট না করেই আমার অ্যাপ্লিকেশনটি চালিত করুন"
এরিকসন

আমার প্রাথমিক উত্তরটি ভুল ছিল বলে আমি আমার উত্তরটির সম্পূর্ণ সম্পাদনা করেছি।
jangofan
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.