First off- a 14 character alpha-numeric full table would take about 1,600,000,000,000,000,000 entries. An additional password character adds 36^15 next character adds 36^16. (Based on all caps)
Next, rainbow Table do NOT store ALL combinations. They store a start range and an end range based on the hash. Therefore the engine compares the hash, finds what password range it falls within, and bruteforces THESE passwords. This is known as the Time-Memory trade off.
I have an Alpha(small+cap), numeric, extended character, 1 through 45 character rainbow table set on a 50 DVDs and STILL only get a 45.362% chance of breaching a "12 character salted" pass phrase EVEN WHEN I KNOW WHAT THE SALT IS. (LophtCrack, John the Ripper, RainbowCrack, Ophcrack, Cain n Able)
Simply Pass=2f+(MD5(MD5([Pass Phrase])+[Pass Phrase]))+3e
This creates a "hash" that doesn't match known hash length and creates a pass phrase at least 33 characters long (assuming [Pass Phrase]="A"
So Then we have Pass=2f+(MD5(5f4dcc3b5aa765d61d8327deb882cf99A)))+3e
Yielding Final: Pass=2f2e463de3a23c0d6e33e67313cfc9b5e63e
Try running that through rainbow tables and the engine won't even load the tables. It won't see a hash.
If a hacker has physical access to the hardware, he could open a DOS box and ADD himself as an Admin in 2 lines. So rainbow tables are for REMOTELY getting a password. Much easier to just use packet gathering on the network and just get the password from there. (Take a look at the Cain n Able tools if you don't believe me.)
Software-wise, they will reverse engineer the software and BYPASS; "patch", or use your own code to create a "key generator". It is an unending battle.