ক্রিপ্টোগ্রাফি

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

শুধুমাত্র Android কীস্টোর সিস্টেমের সাথে একটি প্রদানকারী নির্দিষ্ট করুন

আপনি যদি অ্যান্ড্রয়েড কীস্টোর সিস্টেম ব্যবহার করেন তবে আপনাকে অবশ্যই একটি প্রদানকারী নির্দিষ্ট করতে হবে

অন্যান্য পরিস্থিতিতে, যাইহোক, Android একটি নির্দিষ্ট অ্যালগরিদমের জন্য একটি নির্দিষ্ট প্রদানকারীর গ্যারান্টি দেয় না। অ্যান্ড্রয়েড কীস্টোর সিস্টেম ব্যবহার না করে একটি প্রদানকারীকে নির্দিষ্ট করা ভবিষ্যতে রিলিজে সামঞ্জস্যের সমস্যা সৃষ্টি করতে পারে।

একটি প্রস্তাবিত অ্যালগরিদম চয়ন করুন

যখন আপনার কোন অ্যালগরিদম ব্যবহার করতে হবে তা বেছে নেওয়ার স্বাধীনতা থাকে (যেমন যখন আপনার তৃতীয় পক্ষের সিস্টেমের সাথে সামঞ্জস্যের প্রয়োজন হয় না), তখন আমরা নিম্নলিখিত অ্যালগরিদমগুলি ব্যবহার করার পরামর্শ দিই:

ক্লাস সুপারিশ
সাইফার 256-বিট কী সহ CBC বা GCM মোডে AES (যেমন AES/GCM/NoPadding )
বার্তা ডাইজেস্ট SHA-2 পরিবার (যেমন SHA-256 )
ম্যাক SHA-2 পরিবার HMAC (যেমন HMACSHA256 )
স্বাক্ষর ECDSA সহ SHA-2 পরিবার (যেমন SHA256withECDSA )

সাধারণ ক্রিপ্টোগ্রাফিক ক্রিয়াকলাপ সম্পাদন করুন

নিম্নলিখিত বিভাগগুলি স্নিপেটগুলি অন্তর্ভুক্ত করে যা প্রদর্শন করে যে আপনি কীভাবে আপনার অ্যাপে সাধারণ ক্রিপ্টোগ্রাফিক ক্রিয়াকলাপগুলি সম্পূর্ণ করতে পারেন৷

একটি বার্তা এনক্রিপ্ট করুন

কোটলিন

val plaintext: ByteArray = ...
val keygen = KeyGenerator.getInstance("AES")
keygen.init(256)
val key: SecretKey = keygen.generateKey()
val cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING")
cipher.init(Cipher.ENCRYPT_MODE, key)
val ciphertext: ByteArray = cipher.doFinal(plaintext)
val iv: ByteArray = cipher.iv

জাভা

byte[] plaintext = ...;
KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init(256);
SecretKey key = keygen.generateKey();
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] ciphertext = cipher.doFinal(plaintext);
byte[] iv = cipher.getIV();

একটি বার্তা ডাইজেস্ট তৈরি করুন

কোটলিন

val message: ByteArray = ...
val md = MessageDigest.getInstance("SHA-256")
val digest: ByteArray = md.digest(message)

জাভা

byte[] message = ...;
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] digest = md.digest(message);

একটি ডিজিটাল স্বাক্ষর তৈরি করুন

আপনার সাইনিং কী সহ একটি PrivateKey অবজেক্ট থাকতে হবে, যা আপনি রানটাইমে তৈরি করতে পারেন, আপনার অ্যাপের সাথে বান্ডিল করা ফাইল থেকে পড়তে পারেন বা আপনার প্রয়োজনের উপর নির্ভর করে অন্য কোনো উৎস থেকে পেতে পারেন।

কোটলিন

val message: ByteArray = ...
val key: PrivateKey = ...
val s = Signature.getInstance("SHA256withECDSA")
        .apply {
            initSign(key)
            update(message)
        }
val signature: ByteArray = s.sign()

জাভা

byte[] message = ...;
PrivateKey key = ...;
Signature s = Signature.getInstance("SHA256withECDSA");
s.initSign(key);
s.update(message);
byte[] signature = s.sign();

একটি ডিজিটাল স্বাক্ষর যাচাই করুন

আপনার কাছে স্বাক্ষরকারীর সর্বজনীন কী সম্বলিত একটি PublicKey অবজেক্ট থাকতে হবে, যা আপনি আপনার অ্যাপের সাথে বান্ডিল করা একটি ফাইল থেকে পড়তে পারেন, একটি শংসাপত্র থেকে বের করতে পারেন বা আপনার প্রয়োজনের উপর নির্ভর করে অন্য কোনো উৎস থেকে পেতে পারেন।

কোটলিন

val message: ByteArray = ...
val signature: ByteArray = ...
val key: PublicKey = ...
val s = Signature.getInstance("SHA256withECDSA")
        .apply {
            initVerify(key)
            update(message)
        }
val valid: Boolean = s.verify(signature)

জাভা

byte[] message = ...;
byte[] signature = ...;
PublicKey key = ...;
Signature s = Signature.getInstance("SHA256withECDSA");
s.initVerify(key);
s.update(message);
boolean valid = s.verify(signature);

বাস্তবায়ন জটিলতা

অ্যান্ড্রয়েড ক্রিপ্টোগ্রাফি বাস্তবায়নের কিছু বিবরণ রয়েছে যা অস্বাভাবিক বলে মনে হয় কিন্তু সামঞ্জস্যের উদ্বেগের কারণে উপস্থিত। এই বিভাগে আপনি সম্ভবত সম্মুখীন হবে যে বেশী আলোচনা.

OAEP MGF1 বার্তা ডাইজেস্ট

RSA OAEP সাইফার দুটি ভিন্ন বার্তা ডাইজেস্ট দ্বারা প্যারামিটারাইজ করা হয়: "প্রধান" ডাইজেস্ট এবং MGF1 ডাইজেস্ট। Cipher আইডেন্টিফায়ার আছে যা ডাইজেস্টের নাম অন্তর্ভুক্ত করে, যেমন Cipher.getInstance("RSA/ECB/OAEPwithSHA-256andMGF1Padding") , যা প্রধান ডাইজেস্টকে নির্দিষ্ট করে এবং MGF1 ডাইজেস্টকে অনির্দিষ্ট রাখে। অ্যান্ড্রয়েড কীস্টোরের জন্য, SHA-1 MGF1 ডাইজেস্টের জন্য ব্যবহৃত হয়, যেখানে অন্যান্য Android ক্রিপ্টোগ্রাফিক প্রদানকারীর জন্য, দুটি ডাইজেস্ট একই।

আপনার অ্যাপ যে ডাইজেস্টগুলি ব্যবহার করে তার উপর আরও নিয়ন্ত্রণের জন্য, Cipher.getInstance("RSA/ECB/OAEPPadding") এর মতো OAEPPadding-এর সাথে একটি সাইফারের অনুরোধ করুন এবং স্পষ্টভাবে উভয় ডাইজেস্ট বেছে নেওয়ার জন্য init() জন্য একটি OAEPParameterSpec প্রদান করুন৷ এটি নিম্নলিখিত কোডে দেখানো হয়েছে:

কোটলিন

val key: Key = ...
val cipher = Cipher.getInstance("RSA/ECB/OAEPPadding")
        .apply {
            // To use SHA-256 the main digest and SHA-1 as the MGF1 digest
            init(Cipher.ENCRYPT_MODE, key, OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT))
            // To use SHA-256 for both digests
            init(Cipher.ENCRYPT_MODE, key, OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT))
        }

জাভা

Key key = ...;
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPPadding");
// To use SHA-256 the main digest and SHA-1 as the MGF1 digest
cipher.init(Cipher.ENCRYPT_MODE, key, new OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT));
// To use SHA-256 for both digests
cipher.init(Cipher.ENCRYPT_MODE, key, new OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT));

অপ্রচলিত কার্যকারিতা

নিম্নোক্ত বিভাগগুলি অবহেলিত কার্যকারিতা বর্ণনা করে। আপনার অ্যাপে এটি ব্যবহার করবেন না।

বাউন্সি ক্যাসল অ্যালগরিদম

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

কোটলিন

Cipher.getInstance("AES/CBC/PKCS7PADDING", "BC")
// OR
Cipher.getInstance("AES/CBC/PKCS7PADDING", Security.getProvider("BC"))

জাভা

Cipher.getInstance("AES/CBC/PKCS7PADDING", "BC");
// OR
Cipher.getInstance("AES/CBC/PKCS7PADDING", Security.getProvider("BC"));

শুধুমাত্র Android কীস্টোর সিস্টেমের সাথে একটি প্রদানকারীকে নির্দিষ্ট করার বিষয়ে বিভাগে উল্লেখ করা হয়েছে, একটি নির্দিষ্ট প্রদানকারীর অনুরোধ করা নিরুৎসাহিত করা হয়। আপনি যদি সেই নির্দেশিকা অনুসরণ করেন, তাহলে এই অবচয় আপনাকে প্রভাবিত করবে না।

একটি ইনিশিয়ালাইজেশন ভেক্টর ছাড়াই পাসওয়ার্ড-ভিত্তিক এনক্রিপশন সাইফার

পাসওয়ার্ড-ভিত্তিক এনক্রিপশন (PBE) সাইফারের জন্য একটি ইনিশিয়ালাইজেশন ভেক্টর (IV) প্রয়োজন, এটি কী থেকে পেতে পারে, যদি এটি উপযুক্তভাবে তৈরি করা হয় বা স্পষ্টভাবে পাস করা IV থেকে। আপনি যদি একটি PBE কী পাস করেন যাতে একটি IV নেই এবং একটি স্পষ্ট IV পাস না হয়, তাহলে Android-এর PBE সাইফারগুলি বর্তমানে শূন্যের IV অনুমান করে।

PBE সাইফার ব্যবহার করার সময়, সর্বদা একটি স্পষ্ট IV পাস করুন, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

কোটলিন

val key: SecretKey = ...
val cipher = Cipher.getInstance("PBEWITHSHA256AND256BITAES-CBC-BC")
val iv = ByteArray(16)
SecureRandom().nextBytes(iv)
cipher.init(Cipher.ENCRYPT_MODE, key, IvParameterSpec(iv))

জাভা

SecretKey key = ...;
Cipher cipher = Cipher.getInstance("PBEWITHSHA256AND256BITAES-CBC-BC");
byte[] iv = new byte[16];
new SecureRandom().nextBytes(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));

ক্রিপ্টো প্রদানকারী

Android 9 (API স্তর 28) হিসাবে, ক্রিপ্টো জাভা ক্রিপ্টোগ্রাফি আর্কিটেকচার (JCA) প্রদানকারীকে সরিয়ে দেওয়া হয়েছে। যদি আপনার অ্যাপ ক্রিপ্টো প্রদানকারীর একটি উদাহরণের অনুরোধ করে, যেমন নিম্নলিখিত পদ্ধতিতে কল করে, একটি NoSuchProviderException ঘটে।

কোটলিন

SecureRandom.getInstance("SHA1PRNG", "Crypto")

জাভা

SecureRandom.getInstance("SHA1PRNG", "Crypto");

জেটপ্যাক নিরাপত্তা ক্রিপ্টো লাইব্রেরি

জেটপ্যাক নিরাপত্তা ক্রিপ্টো লাইব্রেরি বাতিল করা হয়েছে। এটি শুধুমাত্র সেই ক্ষেত্রেই প্রভাবিত করে যেখানে আপনার অ্যাপ মডিউলের build.gradle ফাইলে নিম্নলিখিত নির্ভরতা রয়েছে:

গ্রোভি

dependencies {
    implementation "androidx.security:security-crypto:1.0.0"
}

কোটলিন

dependencies {
    implementation("androidx.security:security-crypto:1.0.0")
}

সমর্থিত অ্যালগরিদম

এগুলি হল JCA অ্যালগরিদম শনাক্তকারী যা Android-এ সমর্থিত: