Which is why I like the method of increasing the login processing time per invalid login. It seems to be the easiest way to prevent most attacks.
1st attempt - 1 second sleep
...
nth attempt - n^2 second sleep
Something of that nature.
[edit] - the sleep time INCLUDES the time required to process the login credentials