অনিরাপদ মেশিন-টু-মেশিন যোগাযোগ সেটআপ

OWASP বিভাগ: MASVS-CODE: কোড গুণমান

ওভারভিউ

রেডিও ফ্রিকোয়েন্সি (RF) যোগাযোগ বা কেবলযুক্ত সংযোগ ব্যবহার করে ব্যবহারকারীদের ডেটা স্থানান্তর, বা অন্যান্য ডিভাইসের সাথে ইন্টারঅ্যাক্ট করার অনুমতি দেয় এমন অ্যাপ্লিকেশনগুলি দেখা বিরল নয়। এই উদ্দেশ্যে অ্যান্ড্রয়েডে ব্যবহৃত সবচেয়ে সাধারণ প্রযুক্তি হল ক্লাসিক ব্লুটুথ (ব্লুটুথ BR/EDR), ব্লুটুথ লো এনার্জি (BLE), Wifi P2P, NFC এবং USB।

এই প্রযুক্তিগুলি সাধারণত অ্যাপ্লিকেশানগুলিতে প্রয়োগ করা হয় যেগুলি স্মার্ট হোম আনুষাঙ্গিক, স্বাস্থ্য পর্যবেক্ষণ ডিভাইস, পাবলিক ট্রান্সপোর্ট কিয়স্ক, পেমেন্ট টার্মিনাল এবং অন্যান্য Android-চালিত ডিভাইসগুলির সাথে যোগাযোগ করবে বলে আশা করা হয়।

অন্য যেকোনো চ্যানেলের মতো, মেশিন-টু-মেশিন যোগাযোগগুলি আক্রমণের জন্য সংবেদনশীল যেগুলির লক্ষ্য দুই বা ততোধিক ডিভাইসের মধ্যে প্রতিষ্ঠিত বিশ্বাসের সীমানাকে আপস করা। যোগাযোগ চ্যানেলের বিরুদ্ধে বিস্তৃত সংখ্যক আক্রমণ অর্জনের জন্য দূষিত ব্যবহারকারীদের দ্বারা ডিভাইসের ছদ্মবেশের মতো কৌশলগুলি ব্যবহার করা যেতে পারে।

অ্যান্ড্রয়েড ডেভেলপারদের জন্য উপলব্ধ মেশিন-টু-মেশিন যোগাযোগ কনফিগার করার জন্য নির্দিষ্ট API তৈরি করে।

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

প্রভাব

অ্যাপ্লিকেশানে বাস্তবায়িত ডিভাইস-টু-ডিভাইস প্রযুক্তি অনুসারে প্রভাব পরিবর্তিত হতে পারে।

মেশিন-টু-মেশিন যোগাযোগ চ্যানেলগুলির ভুল ব্যবহার বা কনফিগারেশন ব্যবহারকারীর ডিভাইসটিকে অবিশ্বস্ত যোগাযোগের প্রচেষ্টার সম্মুখীন হতে পারে। এটি ডিভাইসটিকে ম্যান-ইন-দ্য-মিডল (MiTM), কমান্ড ইনজেকশন, DoS বা ছদ্মবেশী আক্রমণের মতো অতিরিক্ত আক্রমণের জন্য ঝুঁকিপূর্ণ হতে পারে।

ঝুঁকি: ওয়্যারলেস চ্যানেলের মাধ্যমে সংবেদনশীল তথ্য গোপন করা

মেশিন-টু-মেশিন কমিউনিকেশন মেকানিজম প্রয়োগ করার সময়, ব্যবহৃত প্রযুক্তি এবং যে ধরনের ডেটা প্রেরণ করা উচিত উভয়ের দিকেই সতর্কতা অবলম্বন করা উচিত। যদিও কেবলযুক্ত সংযোগগুলি অনুশীলনে এই জাতীয় কাজের জন্য আরও সুরক্ষিত, কারণ তাদের জড়িত ডিভাইসগুলির মধ্যে একটি শারীরিক লিঙ্কের প্রয়োজন হয়, ক্লাসিক ব্লুটুথ, BLE, NFC এবং Wifi P2P এর মতো রেডিও ফ্রিকোয়েন্সি ব্যবহার করে যোগাযোগের প্রোটোকলগুলি আটকানো যেতে পারে। একজন আক্রমণকারী ডেটা আদান-প্রদানের সাথে জড়িত টার্মিনাল বা অ্যাক্সেস পয়েন্টগুলির একটির ছদ্মবেশ ধারণ করতে সক্ষম হতে পারে, বাতাসের মাধ্যমে যোগাযোগকে বাধা দেয়, ফলস্বরূপ সংবেদনশীল ব্যবহারকারীর ডেটাতে অ্যাক্সেস লাভ করে। অতিরিক্তভাবে, ডিভাইসে ইনস্টল করা দূষিত অ্যাপ্লিকেশনগুলি, যদি যোগাযোগ-নির্দিষ্ট রানটাইম অনুমতি দেওয়া হয়, তাহলে সিস্টেম বার্তা বাফারগুলি পড়ার মাধ্যমে ডিভাইসগুলির মধ্যে আদান-প্রদান করা ডেটা পুনরুদ্ধার করতে সক্ষম হতে পারে৷

প্রশমন

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


ঝুঁকি: ওয়্যারলেস ক্ষতিকারক ডেটা ইনজেকশন

ওয়্যারলেস মেশিন-টু-মেশিন যোগাযোগ চ্যানেলগুলি (ক্লাসিক ব্লুটুথ, BLE, NFC, Wifi P2P) ��্ষতিকারক ডেটা ব্যবহার করে বিকৃত করা যেতে পারে। পর্যাপ্ত দক্ষ আক্রমণকারীরা ব্যবহারে যোগাযোগের প্রোটোকল সনাক্ত করতে পারে এবং ডেটা বিনিময় প্রবাহের সাথে হস্তক্ষেপ করতে পারে, উদাহরণস্বরূপ, শেষ পয়েন্টগুলির একটিকে ছদ্মবেশী করে, বিশেষভাবে তৈরি করা পেলোডগুলি প্রেরণ করে। এই ধরনের দূষিত ট্র্যাফিক অ্যাপ্লিকেশনটির কার্যকারিতা হ্রাস করতে পারে এবং সবচেয়ে খারাপ পরিস্থিতিতে, অপ্রত্যাশিত অ্যাপ্লিকেশন এবং ডিভাইস আচরণের কারণ হতে পারে, বা DoS, কমান্ড ইনজেকশন বা ডিভাইস টেকওভারের মতো আক্রমণের কারণ হতে পারে।

প্রশমন

অ্যান্ড্রয়েড ডেভেলপারদেরকে মেশিন-টু-মেশিন যোগাযোগ পরিচালনা করতে শক্তিশালী API প্রদান করে যেমন ক্লাসিক ব্লুটুথ, BLE, NFC এবং Wifi P2P। দুটি ডিভাইসের মধ্যে আদান-প্রদান করা যেকোনো ডেটা স্যানিটাইজ করার জন্য এগুলিকে একটি সাবধানে প্রয়োগ করা ডেটা বৈধতা যুক্তির সাথে একত্রিত করা উচিত।

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

নিম্নলিখিত স্নিপেট উদাহরণ তথ্য বৈধতা যুক্তি দেখায়. এটি ব্লুটুথ ডেটা স্থানান্তর বাস্তবায়নের জন্য অ্যান্ড্রয়েড বিকাশকারীদের উদাহরণের উপর প্রয়োগ করা হয়েছিল:

কোটলিন

class MyThread(private val mmInStream: InputStream, private val handler: Handler) : Thread() {

    private val mmBuffer = ByteArray(1024)
      override fun run() {
        while (true) {
            try {
                val numBytes = mmInStream.read(mmBuffer)
                if (numBytes > 0) {
                    val data = mmBuffer.copyOf(numBytes)
                    if (isValidBinaryData(data)) {
                        val readMsg = handler.obtainMessage(
                            MessageConstants.MESSAGE_READ, numBytes, -1, data
                        )
                        readMsg.sendToTarget()
                    } else {
                        Log.w(TAG, "Invalid data received: $data")
                    }
                }
            } catch (e: IOException) {
                Log.d(TAG, "Input stream was disconnected", e)
                break
            }
        }
    }

    private fun isValidBinaryData(data: ByteArray): Boolean {
        if (// Implement data validation rules here) {
            return false
        } else {
            // Data is in the expected format
            return true
        }
    }
}

জাভা

public void run() {
            mmBuffer = new byte[1024];
            int numBytes; // bytes returned from read()
            // Keep listening to the InputStream until an exception occurs.
            while (true) {
                try {
                    // Read from the InputStream.
                    numBytes = mmInStream.read(mmBuffer);
                    if (numBytes > 0) {
                        // Handle raw data directly
                        byte[] data = Arrays.copyOf(mmBuffer, numBytes);
                        // Validate the data before sending it to the UI activity
                        if (isValidBinaryData(data)) {
                            // Data is valid, send it to the UI activity
                            Message readMsg = handler.obtainMessage(
                                    MessageConstants.MESSAGE_READ, numBytes, -1,
                                    data);
                            readMsg.sendToTarget();
                        } else {
                            // Data is invalid
                            Log.w(TAG, "Invalid data received: " + data);
                        }
                    }
                } catch (IOException e) {
                    Log.d(TAG, "Input stream was disconnected", e);
                    break;
                }
            }
        }

        private boolean isValidBinaryData(byte[] data) {
            if (// Implement data validation rules here) {
                return false;
            } else {
                // Data is in the expected format
                return true;
           }
    }

ঝুঁকি: USB দূষিত ডেটা ইনজেকশন

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

যদি অ্যাপ্লিকেশনটি নির্দিষ্ট ইন-অ্যাপ কার্যকারিতা ট্রিগার করার জন্য PID/VID ব্যবহার করে USB ডিভাইসগুলিকে ফিল্টার করে, তাহলে আক্রমণকারীরা বৈধ ডিভাইসের ছদ্মবেশী করে USB চ্যানেলের মাধ্যমে পাঠানো ডেটার সাথে টেম্পার করতে সক্ষম হতে পারে৷ এই ধরনের আক্রমণগুলি দূষিত ব্যবহারকারীদের ডিভাইসে কীস্ট্রোক পাঠাতে বা অ্যাপ্লিকেশন ক্রিয়াকলাপ চালানোর অনুমতি দেয় যা, সবচেয়ে খারাপ ক্ষেত্রে, দূরবর্তী কোড নির্বাহ বা অবাঞ্ছিত সফ্টওয়্যার ডাউনলোডের দিকে নিয়ে যেতে পারে।

প্রশমন

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

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

এই বৈধতা বাফার বিষয়বস্তু পরীক্ষা করার জন্য একটি নতুন থ্রেড তৈরি করে সম্পন্ন করা যেতে পারে, উদাহরণস্বরূপ, একটি bulkTransfer :

কোটলিন

fun performBulkTransfer() {
    // Stores data received from a device to the host in a buffer
    val bytesTransferred = connection.bulkTransfer(endpointIn, buffer, buffer.size, 5000)

    if (bytesTransferred > 0) {
        if (//Checks against buffer content) {
            processValidData(buffer)
        } else {
            handleInvalidData()
        }
    } else {
        handleTransferError()
    }
}

জাভা

public void performBulkTransfer() {
        //Stores data received from a device to the host in a buffer
        int bytesTransferred = connection.bulkTransfer(endpointIn, buffer, buffer.length, 5000);
        if (bytesTransferred > 0) {
            if (//Checks against buffer content) {
                processValidData(buffer);
            } else {
                handleInvalidData();
            }
        } else {
            handleTransferError();
        }
    }

নির্দিষ্ট ঝুঁকি

এই বিভাগটি এমন ঝুঁকি সংগ্রহ করে যেগুলির জন্য অ-মানক প্রশমন কৌশল প্রয়োজন বা নির্দিষ্ট SDK স্তরে প্রশমিত করা হয়েছে এবং সম্পূর্ণতার জন্য এখানে রয়েছে।

ঝুঁকি: ব্লুটুথ - ভুল আবিষ্কারের সময়

অ্যান্ড্রয়েড ডেভেলপারদের ব্লুটুথ ডকুমেন্টেশনে হাইলাইট করা হয়েছে, অ্যাপ্লিকেশানের মধ্যে ব্লুটুথ ইন্টারফেস কনফিগার করার সময়, ডিভাইস আবিষ্কারযোগ্যতা সক্ষম করতে startActivityForResult(Intent, int) পদ্ধতি ব্যবহার করে এবং EXTRA_DISCOVERABLE_DURATION শূন্যে সেট করার ফলে ডিভাইসটি যতক্ষণ পর্যন্ত অ্যাপ্লিকেশন থাকবে ততক্ষণ পর্যন্ত আবিষ্কারযোগ্য হবে। হয় ব্যাকগ্রাউন্ডে বা ফোরগ্রাউন্ডে চলছে। ক্লাসিক ব্লুটুথ স্পেসিফিকেশন হিসাবে, আবিষ্কারযোগ্য ডিভাইসগুলি ক্রমাগত নির্দিষ্ট আবিষ্কার বার্তাগুলি সম্প্রচার করে যা অন্যান্য ডিভাইসগুলিকে ডিভাইসের ডেটা পুনরুদ্ধার করতে বা এটির সাথে সংযোগ করতে দেয়৷ এই ধরনের পরিস্থিতিতে, একটি ক্ষতিকারক তৃতীয়-পক্ষ এই ধরনের বার্তাগুলিকে আটকাতে পারে এবং Android-চালিত ডিভাইসের সাথে সংযোগ করতে পারে। একবার সংযুক্ত হলে, একজন আক্রমণকারী আরও আক্রমণ করতে পারে যেমন ডেটা চুরি, DoS, বা কমান্ড ইনজেকশন।

প্রশমন

EXTRA_DISCOVERABLE_DURATION কখনই শূন্যে সেট করা উচিত নয়৷ EXTRA_DISCOVERABLE_DURATION প্যারামিটার সেট না থাকলে, ডিফল্ট��ূপে, Android ডিভাইসগুলিকে 2 মিনিটের জন্য আবিষ্কারযোগ্য করে তোলে। EXTRA_DISCOVERABLE_DURATION প্যারামিটারের জন্য সর্বোচ্চ যে মান সেট করা যেতে পারে তা হল 2 ঘন্টা (7200 সেকেন্ড)। অ্যাপ্লিকেশান ব্যবহারের কেস অনুসারে এটি আবিষ্কারযোগ্য সময়কালকে সংক্ষিপ্ততম সময়ের জন্য রাখা বাঞ্ছনীয়।


ঝুঁকি: NFC - ক্লোন করা অভিপ্রায়-ফিল্টার

একটি দূষিত অ্যাপ্লিকেশন নির্দিষ্ট NFC ট্যাগ বা NFC-সক্ষম ��িভাইসগুলি ����়ার জন্য উদ্দেশ্য-ফিল্টার নিবন্ধন করতে পারে৷ এই ফিল্টারগুলি একটি বৈধ অ্যাপ্লিকেশন দ্বারা সংজ্ঞায়িতগুলির প্রতিলিপি তৈরি করতে পারে, যা আক্রমণকারীর পক্ষে বিনিময় করা NFC ডেটার বিষয়বস্তু পড়া সম্ভব করে তোলে৷ এটি লক্ষ করা উচিত যে, যখন দুটি ক্রিয়াকলাপ একটি নির্দিষ্ট এনএফসি ট্যাগের জন্য একই অভিপ্রায়-ফিল্টার নির্দিষ্ট করে, তখন অ্যাক্টিভিটি চয়নকারী উপস্থাপন করা হয়, তাই আক্রমণ সফল হওয়ার জন্য ব্যবহারকারীকে এখনও দূষিত অ্যাপ্লিকেশন বেছে নিতে হবে। তবুও, ক্লোকিংয়ের সাথে অভিপ্রায়-ফিল্টারগুলিকে একত্রিত করা, এই দৃশ্যটি এখনও সম্ভব। এই আক্রমণটি শুধুমাত্র সেই ক্ষেত্রেই তাৎপর্যপূর্ণ যেখানে NFC-এর মাধ্যমে ডেটা আদান-প্রদানকে অত্যন্ত সংবেদনশীল বলে বিবেচনা করা যেতে পারে।

প্রশমন

একটি অ্যাপ্লিকেশনের মধ্যে এনএফসি পড়ার ক্ষমতা প্রয়োগ করার সময়, অভিপ্রায়-ফিল্টারগুলি অ্যান্ড্রয়েড অ্যাপ্লিকেশন রেকর্ড (AARs) এর সাথে একসাথে ব্যবহার করা যেতে পারে। একটি এনডিইএফ বার্তার মধ্যে এএআর রেকর্ড এম্বেড করা দৃঢ় আশ্বাস দেবে যে শুধুমাত্র বৈধ অ্যাপ্লিকেশন এবং এর সাথে সম্পর্কিত এনডিইএফ হ্যান্ডলিং কার্যকলাপ শুরু হয়েছে। এটি অবাঞ্ছিত অ্যাপ্লিকেশন বা ক্রিয়াকলাপগুলিকে NFC-এর মাধ্যমে আদান-প্রদান করা অত্যন্ত সংবেদনশীল ট্যাগ বা ডিভাইস ডেটা পড়তে বাধা দেবে৷


ঝুঁকি: NFC - NDEF বার্তা যাচাইকরণের অভাব

যখন একটি Android-চালিত ডিভাইস একটি NFC ট্যাগ বা NFC-সক্ষম ডিভাইস থেকে ডেটা গ্রহণ করে, তখন সিস্টেমটি স্বয়ংক্রিয়ভাবে অ্যাপ্লিকেশনটিকে বা নির্দিষ্ট কার্যকলাপটিকে ট্রিগার করে যা ভিতরে থাকা NDEF বার্তাটি পরিচালনা করার জন্য কনফিগার করা হয়। অ্যাপ্লিকেশানে বাস্তবায়িত যুক্তি অনুসারে, ট্যাগে থাকা ডেটা, বা ডিভাইস থেকে প্রাপ্ত, ওয়েব পৃষ্ঠা��ুলি খোলার মতো আরও ক্রিয়াকলাপ ট্রিগার করতে অন্যান্য ক্রিয়াকলাপে পরিবেশন করা যেতে পারে।

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

প্রশমন

প্রাপ্ত NDEF বার্তাটি অন্য কোনো অ্যাপ্লিকেশন উপাদানে পাঠানোর আগে, এর মধ্যে থাকা ডেটা প্রত্যাশিত বিন্যাসে এবং প্রত্যাশিত তথ্য ধারণ করার জন্য যাচাই করা উচিত। এটি দূষিত ডেটা অন্য অ্যাপ্লিকেশনের উপাদানগুলিকে ফিল্টার ছাড়াই প্রেরণ করা এড়ায়, অপ্রত্যাশিত আচরণ বা বিকৃত এনএফসি ডেটা ব্যবহার করে আক্রমণের ঝুঁকি হ্রাস করে৷

নিম্নলিখিত স্নিপেটটি বার্তা অ্যারেতে একটি NDEF বার্তার সাথে একটি যুক্তি হিসাবে এবং এর সূচী সহ একটি পদ্ধতি হিসাবে প্রয়োগ করা ডেটা বৈধতা যুক্তির উদাহরণ দেখায়। এটি একটি স্ক্যান করা এনএফসি এনডিইএফ ট্যাগ থেকে ডেটা পেতে অ্যান্ড্রয়েড বিকাশকারীদের উদাহরণের উপর প্রয়োগ করা হয়েছিল:

কোটলিন

//The method takes as input an element from the received NDEF messages array
fun isValidNDEFMessage(messages: Array<NdefMessage>, index: Int): Boolean {
    // Checks if the index is out of bounds
    if (index < 0 || index >= messages.size) {
        return false
    }
    val ndefMessage = messages[index]
    // Retrieves the record from the NDEF message
    for (record in ndefMessage.records) {
        // Checks if the TNF is TNF_ABSOLUTE_URI (0x03), if the Length Type is 1
        if (record.tnf == NdefRecord.TNF_ABSOLUTE_URI && record.type.size == 1) {
            // Loads payload in a byte array
            val payload = record.payload

            // Declares the Magic Number that should be matched inside the payload
            val gifMagicNumber = byteArrayOf(0x47, 0x49, 0x46, 0x38, 0x39, 0x61) // GIF89a

            // Checks the Payload for the Magic Number
            for (i in gifMagicNumber.indices) {
                if (payload[i] != gifMagicNumber[i]) {
                    return false
                }
            }
            // Checks that the Payload length is, at least, the length of the Magic Number + The Descriptor
            if (payload.size == 13) {
                return true
            }
        }
    }
    return false
}

জাভা

//The method takes as input an element from the received NDEF messages array
    public boolean isValidNDEFMessage(NdefMessage[] messages, int index) {
        //Checks if the index is out of bounds
        if (index < 0 || index >= messages.length) {
            return false;
        }
        NdefMessage ndefMessage = messages[index];
        //Retrieve the record from the NDEF message
        for (NdefRecord record : ndefMessage.getRecords()) {
            //Check if the TNF is TNF_ABSOLUTE_URI (0x03), if the Length Type is 1
            if ((record.getTnf() == NdefRecord.TNF_ABSOLUTE_URI) && (record.getType().length == 1)) {
                //Loads payload in a byte array
                byte[] payload = record.getPayload();
                //Declares the Magic Number that should be matched inside the payload
                byte[] gifMagicNumber = {0x47, 0x49, 0x46, 0x38, 0x39, 0x61}; // GIF89a
                //Checks the Payload for the Magic Number
                for (int i = 0; i < gifMagicNumber.length; i++) {
                    if (payload[i] != gifMagicNumber[i]) {
                        return false;
                    }
                }
                //Checks that the Payload length is, at least, the length of the Magic Number + The Descriptor
                if (payload.length == 13) {
                    return true;
                }
            }
        }
        return false;
    }

সম্পদ