rarimo / FreedomTool

MIT License
14 stars 5 forks source link

Улучшение безопасности путем изменения создания MRZ ключа #6

Open Amadeus899 opened 6 months ago

Amadeus899 commented 6 months ago

В данном месте формируется mrz ключ, который вполне можно сформировать самому зная номер паспорта, дату рождения и срок действия:

https://github.com/rarimo/FreedomTool/blob/f9698a1748e9163f924c2513e7746ab41f50fef4/FreedomTools/Models/PassportUtils.swift#L13

Можно избежать подобного риска, дополнительно добавив слой защиты в виде расчета хеш суммы от UUID или identifierForVendor

 static func getMRZKey(passportNumber: String, dateOfBirth: String, dateOfExpiry: String ) -> String {
        let pptNr = pad( passportNumber, fieldLength:9)
        let dob = pad( dateOfBirth, fieldLength:6)
        let exp = pad( dateOfExpiry, fieldLength:6)

        let passportNrChksum = calcCheckSum(pptNr)
        let dateOfBirthChksum = calcCheckSum(dob)
        let expiryDateChksum = calcCheckSum(exp)
        let uuid = calcCheckSum(UUID().uuidString) // or UIDevice.current.identifierForVendor?.uuidString

        let mrzKey = "\(uuid)\(pptNr)\(passportNrChksum)\(dob)\(dateOfBirthChksum)\(exp)\(expiryDateChksum)"

        return mrzKey
    }
Amadeus899 commented 6 months ago

Та же проблема и в Андроиде:

private MRZInfo buildTempMrz(String documentNumber, String dateOfBirth, String expiryDate) {
        MRZInfo mrzInfo = null;
        try {
            mrzInfo = new MRZInfo("P", "NNN", "", "", documentNumber, "NNN", dateOfBirth, Gender.UNSPECIFIED, expiryDate, "");
        } catch (Exception e) {
            Log.d(TAG, "MRZInfo error : " + e.getLocalizedMessage());
        }

        return mrzInfo;
    }
ivanlele commented 6 months ago

Hi, to read the data from the ePassport's NFC chip, we need to know its MRZ key, which we read with the device's camera. Adding anything else to the MRZ key will no longer make the key valid, so we won't be able to read the chip