Spinner Ravindra Jadeja and seamer Jasprit Bumrah wreaked havoc in the extended morning session when Bangladesh lost eight wickets to be bowled out for a paltry 146.
It left India needing 95 on the final day and they did it with more than a session to spare losing three wickets in the process.
Yashasvi Jaiswal led their chase with a fluent 51, his second half-century of the match, before his dismissal while Virat Kohli remained unbeaten on 29.
This was India's record-extending 18th consecutive Test series victory on home soil.
"To make a game out of it on that pitch was a superb effort," India captain Rohit Sharma said.
"When we came on day four, we thought 'let's try and get them out as quickly as possible and then see what we can do with the bat'...
"The pitch did not have much for the bowler but to make a game out of it was a superb effort by the bowlers."
Earlier, Bangladesh suffered an early blow after resuming on 26-2 in a match, which lost two and half days to bad weather.
Ravichandran Ashwin (3-50) claimed his third wicket of the innings when he had Mominul Haque caught in the leg slip for two.
Shadman Islam (50) and skipper Najmul Hossain Shanto (19) offered brief resistance with a 55-run stand before poor shot selection and smart bowling changes by India led to their dismissals.
Jadeja (3-34) bowled Shanto after the batter fluffed a reverse sweep he should not have attempted in the first place considering the tricky situation they were in.
Shadman completed his fifty before playing away from his body, edging seamer Akash Deep to Yashasvi Jaiswal at the lone slip.
Left-arm spinner Jadeja removed Litton Das and Shakib Al Hasan in successive overs and seamer Bumrah sent back Mehidy Hasan Miraz to pin Bangladesh.
Mushfiqur Rahim (37) hung around for a bit before Bumrah (3-17) removed him with the final delivery of the session.