I am using Mifare Ultralight C to make a access control system. The method I am using is based on the UID of the card. I can read the UID by NFC Reader (SeeedStudio shield on Arduino UNO) However, the UID is not reliable since there are writable UID card out there in the market. So I think that I should secure the connection by 3DES authentication and then block the reading from 0x00 which is from the first serial number byte. Is it the correct way to implement access control?
You cannot block read access to the UID. The UID is an immanent part of the anticollision/tag enumeration phase of ISO 14443 so the tag will always reveal that information. Moreover, Ultralight C permits read/write protection only from page 3 to the end of the memory.
What you could do is the following:
Derive a tag-specific key based on a master key and the tag's UID.
Ktag = fkey_derivation(UIDtag, Kmaster)
Use that key Ktag as 3DES key for the Ultralight C authentication.
And finally: MIFARE Ultralight C is certainly not meant to be used for access control!