Steyn took four for 16 as Bangladesh were bowled out for 222 in reply to South Africa's 283 for eight.
Steyn struck twice in his opening spell with the new ball, dismissing Imrul Kayes and Junaid Siddique.
But his most telling contribution came when he returned in the 35th over immediately after the compulsory change of ball. With his first two deliveries he had top-scorer Mohammad Ashraful and Raqibul Hasan caught behind.
Ashraful, the Bangladesh captain, made 73 off 78 balls and while he was at the crease his side had hopes of causing an upset win. His dismissal ended a 92-run fifth wicket partnership with Shakib al Hasan, who made 51.
"Steyn bowled really well," admitted Ashraful.
South African captain Johan Botha said his team had been put under pressure by the stand between Ashraful and Shakib, "but Dale came back nicely".
South Africa's match-winning total owed much to a late flurry of scoring in which they scored 66 runs in the last five overs.
Johann Louw, batting at number nine, hit the first two balls he faced for six and raced to 23 off seven balls.
Skipper Johan Botha made 23 off 15 deliveries, while Albie Morkel finished on 32 not out when he hit the last ball of the innings from Syed Rasel for six.
Until then, the South African batsmen were kept in check by tigerish fielding and accurate bowling on a slow pitch, with wickets falling whenever profitable partnerships seemed to be developing.
They delayed taking the final power play until the last five overs.
Jacques Kallis made 50 and three other top order batsmen reached 30 without going on to play a major innings.
The most fluent batsman was opener Hashim Amla who made 35 off 34 balls before being run out after a mid-pitch collision with bowler Mashrafe Mortaza.
Amla was sent back by opening partner Justin Ontong after the ball squirted out on the leg side off Ontong's pad. As he turned, Amla collided with Mortaza, who was going for the ball. Both men fell and fielder Naeem Islam had an easy task in completing the run-out.
Islam, bowling off-spin, took three for 60 but the most impressive bowler was slow left-armer Shakib al Hasan, who had figures of two for 21 after eight overs before conceding another 27 in his last two overs during the final power play, including the two sixes by Louw.
After Steyn's early strikes Tamim Iqbal and Ashraful put on 54 for the third wicket off only 42 balls. It was a major blow for Bangladesh when Iqbal was run out for 24, to be followed quickly by Mushfiqur Rahim.
Ashraful and Shakib had to rebuild the innings and it took them 90 balls to post a fifty partnership. They were just starting to accelerate, with the next 42 scored off 29 balls, when Steyn's extra pace accounted for Ashraful.
South Africa were without veteran opening batsman Herschelle Gibbs, who was sent home for breaking a team curfew the night before a Twenty20 international between the two teams in Johannesburg on Wednesday.