A 61st-minute free-kick from Hiroshi Kiyotake was enough to seal Hannover's first win at Signal Iduna Park since April 2008, increasing the pressure on Dortmund coach Jurgen Klopp in the process.
The hosts created plenty of chances during a dominant first-half performance, with Mats Hummels seeing his towering header tipped onto the woodwork by Ron-Robert Zieler.
The pressure from Dortmund continued just after the break with Marco Reus wasting several good opportunities before Kiyotake curled home to claim all three points against the run of play.
Ceyhun Gulselam was sent off late on for Hannover, but the visitors held on.
The result ends Hannover's run of three straight Bundesliga defeats and ensured Dortmund slumped to fifth defeat in their last six league games, with Klopp's men still unable to replicate their sparkling UEFA Champions League form domestically.
Klopp slammed his team for being too naive during their defeat to Cologne last weekend and they looked slow off the mark again during a bright start from the visitors.
A long throw from Marius Stankevicius found Leonardo Bittencourt inside the area after just six minutes, only for the former Dortmund man to send a vicious volley whistling past the post.
Despite Hannover's lively opening, Dortmund soon began to find their feet and would have taken the lead were it not for Zieler's smart save, denying Henrikh Mkhitaryan after 12 minutes.
The hosts had not lost to Saturday's opponents in five previous league meetings and soon began to increase the pressure, with Zieler called upon again to tip Hummels' header onto the bar five minutes later, before Pierre-Emerick Aubameyang bent a free-kick just over.
Reus could not keep his curled effort down following some good work from Aubameyang as Dortmund continued to press forward.
Only Hamburg had scored fewer Bundesliga goals than Hannover heading into this weekend and their impotence up front was evident once again during the opening 45 minutes, with Roman Weidenfeller left with little to do.
The hosts continued their dominance just after half-time, with Reus racing down the left flank and firing just wide before forcing another save from Zieler after 55 minutes.
Dortmund's profligacy was punished just after the hour mark when Kiyotake stepped up to bend a superb 25-yard free-kick over the wall and into the top corner to give Hannover an unlikely lead.
That goal gave the visitors more confidence and Kiyotake could have had a second five minutes later, beating the offside trap to force a great save from Weidenfeller, who also had to be alert to deny Joselu moments later.
Klopp threw on Shinji Kagawa as the game approached the final 20 minutes and Adrian Ramos headed wide five minutes later as the hosts continued to push, but an equaliser still eluded them on a disappointing afternoon.
There was one sour note for the visitors when Gulselam was given his marching orders for a second bookable offence one minute from time.
Thank you for reading 5 articles this month* Join now for unlimited access
Enjoy your first month for just £1 / $1 / €1
*Read 5 free articles per month without a subscription
Join now for unlimited access
Try first month for just £1 / $1 / €1
Get daily World Cup 2022 news, updates and other football frolics to your inbox