1

Background

I am developing an Android application for work which runs on a Zebra TC51 bar code scanner, which I have been playing around with.. I scanned my NYS drivers license and inspected the output this morning (sanitized output is below). The output contains 20 lines of data and 1 line of meta data. The standardization body is AAMVA and ANSI. I am curious about two lines (labeled ANSI and ZNB).

I scanned my license and the ANSI labeled line had an associated value string similar to 636001010102DL00910228ZN02790040DLDCADJ (this is sanitized, more explained below) and when I googled it it returned a sketchy Pastebin result with NYS Drivers License data dump, but none of the other information matched (name, dob, etc). So I scanned 10 more NYS ID cards (friends and family) and googled the results. No hits on Google for them.

Question

I am trying to figure out two things

  1. How is the ANSI value string is (ex: 636001010102DL00910228ZN02790040DLDCADJ) created, what is it used for, and what does it communicate. I especifically want to figure out if this value string is meant to be unique.
  2. How is the ZNB value string created, what is it used for (it looks like some type of hash/signature), what does it communicate.

Research I have done

I have done a cursory investigation and read the following material.

I know that the "bar code" is a PDF417 data matrix. I know (and have labeled) most of the key/value pairs.

ZNB looks like a hash or signature (it reminds me of how you need to sign AWS SQS rest calls. I have ran all the data prior to ZNB through the following hashes just to see if anything came out that looked right but no hits (I'm not even sure if it is a hash).

  • SHA-1
  • SHA-256
  • MD5

Unfortunately I cannot find any information about these ANSI and ZNB values. Every other key/value pair is clearly defined in AAMVA DL/ID Card Design Standard except those two.

The data

I sanitized the ANSI valur by swapping numeric characters for other numeric characters but did not change the cardinality of the value string or any of the the alpha characters (the GitHub source said the index of the first DL was important). I left the first 6 digits because another source state that was a significant value as well.

I sanitized ZNB by swapping alpha and numeric characters with other alpha and numeric characters. I did not modify the capitalization of any alpha character in case it is significant. I did not modify either the cardinality of the string or the special characters.

@

ANSI 636001010102DL00910228ZN02790040DLDCADJ   (???) 
DCB (????) 
DCD (organ donor?) 
DBA (date of birth)
DCS (Last name) 
DCT (first name, possibly with middle initial) 
DBD (date issued
DBB (date expired)
DBC (0 or 1 for male for female)
DAY (eye color abbreviated)
DAU (height in footinches) 
DAG (address line) 
DAI (city) 
DAJ (state)
DAK (zip) 
DAQ (license number)
DCF (document number)
DCG (country)
ZNZNA(last name)@(first name)@(middle initial)
ZNB Eg3*#c+W^xmj(Ws8@B?]plW_Db;uk&y*V/d9"1=qG

The sample

  • Sample size of 10
  • All New York State identification cards
  • Formatting was nearly identical for all
  • New Line / Carriage return was encoded (it actually scanned as shown above)
  • Date of Birth of sample participants range from 1951 to 2000
  • The sample include a least one of the following identification types
    • A 2013 model non drivers ID card
    • A 2013 EDL ID card
    • A 2013 Standard (not enhanced) drivers ID card(enhanced)
    • A 2008 Standard drivers ID card

Whats weird is I scanned probably 10 licenses and googled the ANSI string value. Nothing came up for any of them except for mine. Any help or assistance on this would be greatly appreciated

1

This is really basic stuff and is addressed in the AAMVA DL/ID Card Design Standard. You can find it on AAMVA's website. I've written a parser in PHP if you would like it.

All the data..starting with ANSI is sort of a table-of-contents.. it shows the IIN (government authority ID#), AAMVA version, how many subrecords are in this record.. the starting position & length of each sub-record..and probably some other stuff i'm forgetting. the "table of contents" ends when you reach the position of the first sub-record.

Some tags like DAC are/are not used based on what version of AAMVA this record is. so its important to read the AAMVA version number.. and based on that, look for the tags which were used/defined in that particular version of AAMVA. Most tags are the same across all versions.. but some tags like first name and last name have changed over the years.

The ZN sub-record is proprietary to the issuing authority.. NYS has publishes what ZNA is. ZNB is a mystery..probably a hash of the DL# or name or birthdate, etc... or some combination

  • So there's no information on ZNB you're saying? The document you referenced I referenced in my original post. Im a bit confused on your explanation of ANSI value vs the results I got from more scanning. Can you explain that a bit more? I ask because some additional scanning I've done doesn't really seem like ANSI works that way. For example it looks like all 2008 standard driver's ID cards have the same ANSI value – Chris Maggiulli Aug 16 '18 at 11:34
  • At this point I'm more interested in ZNB though. I realize it's "proprietary" which is why it didn't show up in the reference book. But do you have any suggestions on how to possible tackle a problem like this (for example let's say I had a million ZNB values, is there any type of pattern detection tools that could possible tell me if they are using maybe a hash that has been found to have a flaw like and old Sha hash?). Possibly FOIA request? – Chris Maggiulli Aug 16 '18 at 11:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.