im no expert, but i did a few experiments on these a few years ago.
hashes are a one way algorithm, ie you can encypt something to a hash, but you can not decrypt a hash into plain text. An example
plaintext - aaaz
hash - 21232f297a57a5a743894a0e4a801fc3
when your bruteforcer eventually gets to aaaz it will compute the hash and see if it matches 21232f297a57a5a743894a0e4a801fc3. This is fairly long process
Rainbow tables bascially compute all the possible hashes for your given charset. For example I have a few rainbow tables which consist of all lowers and upper case letters and i think they takes up roughly 20GB, so chuck numbers in there and your looking at a fair bit of hd space.
I use cain and able with my rainbow tables, im sure you must be able to use JTR too.
There are lots of tutorials of how to create rainbow tables, i think my old computer took like 4 days to create mine!
as for why JTR didnt work im afraid ive never used it