Set an adjusted target of 122 in 14 overs, Bangladesh needed 25 off the last three overs with four wickets left.
After a tight over by Johann Louw which yielded just three runs, Steyn bowled Naeem Islam and Abdur Razzak as Bangladesh's hopes evaporated.
Left-arm spinner Razzak earlier took four for 16 as South Africa's batsmen chased quick runs in an innings reduced to 14 overs after two interruptions for lightning and rain. They finished with 118 for seven.
Razzak, who was named man of the match, claimed the best figures by a Bangladesh bowler in a Twenty20 international.
South Africa were well placed at 72 for two after 7.5 overs at the second rain break but with only 37 balls remaining after the reduction of overs they lost five wickets, mainly to reckless shots, in adding only 46 more runs.
AB de Villiers, who was dropped twice, scored 36 off 26 balls for South Africa
Bangladesh raced to 56 for one in five overs with opening batsman Tamim Iqbal and captain Mohammad Ashraful going for their shots.
Ashraful made 21 off 10 balls before he charged down the pitch and was bowled by the first delivery sent down by South African captain, offspinner Johan Botha.
Botha also had Iqbal stumped for 25 off 24 balls as the innings lost momentum. Even so, Bangladesh remained in with a chance until Steyn's double strike.
"It was very close," said Botha. "Mohammad started really nicely but luckily we kept getting wickets."
Ashraful said he was disappointed with his team's fielding after they dropped three catches.
"But the boys played good cricket," he said.
"The boys are really confident," he said, looking ahead to a three-match one-day series starting in Potchefstroom Friday.
Only three runs were scored off the first 11 deliveries of the match before Loots Bosman and Herschelle Gibbs went on the attack in an opening stand of 43 before Gibbs was bowled off an inside edge by left-arm seamer Syed Rasel off the first ball of the fifth over.
Gibbs survived a chance to wicketkeeper Mushfiqur Rahim in the first over when he was on one, with Rahim standing up to Rasel. He made 18 off ten balls.
Bosman hit 28 off 18 balls before hitting a high catch to Bangladesh captain Mohammad Ashraful off Razzak.
Bangladesh were without opening bowler and vice-captain Mashrafe Mortaza because of a back injury.
Steyn returned to the South African team after recovering from an illness which kept him out of action since the tour of England which ended in September.