Тыщу раз убеждался, что когда случаются такие "чудеса", значит где-то сидит тихушная бага в логике. Искать ее надо дебагером. Можно и ручками, но намного дольше.
Где прячутся чудеса?
1) Есть ли проверка пароля (сразу как вытаскивается из $_POST) регулярным выражением. Или хотя бы trim().
2) Мог ли в БД дважды попасть юзер с одинаковым логином. (Чтобы гарантированного от этого защититься используй ключ unique key на поле логин).
3) Корректно ли ставятся куки? Пишутся ли туда именно те данные, которые необходимы? Возможно на пути где-то стоит сессия, которую забыли обновить.
4) Если используешь аякс, то проверь правильно ли отправляются данные на сервер.
5) Если пользоваться дебагером западло, то просто внимательно просмотри свой скрипт. Проследи его логику.
Если чудеса не найдены.
1) Создай в БД табличку для отладки, куда пиши id юзера, его логин, оригинальный пароль, пароль после md5(), время записи. Независимо от того прошел он аутентификацию или нет. По этой табличке будешь искать логины с одинаковыми паролями. Скорее всего будут совпадения, т.к. юзеры ошибаются при вводе (а мы ведь фиксируем все), зато наглядно можно будет увидеть, что пихают в поле "пароль". Обрати внимание на непечатные символы (пробелы, табы, перевод строки). Не забудь удалить таблицу после того, как найдешь багу.
Итог.
1) Не пиши в куки открыто логин и пароль. Сериализуй массив и используй библиотеку шифрования mcrypt:
http://ru.php.net/mcrypt
2) Не хешируй пароль по типу md5("my_pass"). Используй md5("my_pass" . "my_secret_word")
3) Обязательно используй регулярки для проверки ВСЕХ входных данных.