Left arm pacer Mustafizur Rahman returned figures of 6-43, his second consecutive five-for, as India was bowled out for 200 in 45 overs.
The match was reduced to 47 overs after a two-hour rain delay with Bangladesh set a winning total of 200 under the Duckworth-Lewis calculation. Shakib Al Hasan smashed 51 not out to help Bangladesh reach 200-4 in just 38 overs. Litton Das made 36 while Soumya Sarkar scored 34.
With an unassailable 2-0 lead in the three-match series, Bangladesh captain Mashrafe Mortaza said it was a "great moment," adding that "to be playing in the Champions Trophy is a big achievement for us."
For India, which won the toss and chose to bat, opener Shikhar Dhawan top-scored with 53 and captain Mahendra Singh Dhoni struggled on his way to a valuable 47.
Mustafizur, who claimed 5-50 on debut for Bangladesh in its 79-run win in the first ODI, again confounded the Indian batsmen with his lethal offcutter.
He became only the second ODI bowler after Zimbabwe's Brian Vitori to claim five-for in his first two matches.
Rubel Hossain had 2-26 and part-time offspinner Nasir Hossain claimed 2-33.
Mustafizur dismissed Rohit Sharma in just the second ball of the innings to leave India 0-1.
Virat Kohli (23) shared a 74-run partnership with Dhawan for the second wicket before falling to Nasir Hossain's delivery that didn't turn as Kohli expected.
The situation worsened when Dhawan and Ambati Rayudu (0) were dismissed in the space of just one run to leave India reeling on 110-4.
Suresh Raina and Dhoni briefly resisted before Mustafizur got both of them to damage India's chances of making a big score.
Rain halted the match for two hours with India at 196-8 in 43.5 overs. With the match reduced to 47 overs, Bangladesh needed just seven balls to wrap up the innings after the game restarted.
"If you have 200 on the board, it is quite easy for the other teams to chase so I won't blame the bowlers for this game," India captain Dhoni said. "We as batsmen got starts, but we didn't make it big."
With the pitch getting slower, India still had a chance but Bangladeshi openers Tamim Iqbal and Soumya added 34 runs in 6.2 overs before the former edged to slip at 13.
Soumya kept hitting and his 34 off 47 balls, including two fours and a six, was backed up by Litton who struck five fours in his 41-ball 36.
Both Soumya and Litton were dismissed in the space of 12 runs to leave Bangladesh at 98-3, giving India a glimmer of hope.
But it was quickly wiped out with Shakib and Mushfiqur Rahim (31) sharing a speedy 54 runs for the fourth wicket to take their side closer.
Shakib took a calculated risk in his 62-ball knock, hitting five fours.
Shakib and Sabbir Rahman closed out the game with 54 balls to spare, delighting the home crowd.
Offspinner Ravichandran Ashwin, left arm spinner Axar Patel and fast bowler Dhawal Kulkarni took one wicket apiece for India.
The third and final ODI is on Wednesday at the same stadium.
Nepal beats Canada in second ODI to clinch series