The Brazilian hit the bar before seeing his spot-kick come back off the post, only for the Ukrainian champions to take the lead when Adriano pounced on an awful error by Porto goalkeeper Helton.
However, Hulk made amends when he sent an unstoppable shot past Olexandr Rybka with a little under half-an-hour gone.
Pinheiro Kleber then tapped home in the second half in a match which saw Shakhtar finish with nine men, Yaroslav Rakitskiy and Dimitro Chygrynskiy both given their marching orders.
Porto almost made the breakthrough in the fifth minute when Hulk curled a 25-yard shot from the right wing which took a deflection and hit the bar before going over with Rybka stranded.
The hosts then squandered a golden chance to take the lead in the 11th minute when they were awarded a penalty for a foul on James Rodriguez.
The midfielder had made his way into the area, playing a short ball to Hulk.
However, as he went to receive the return pass from his team-mate, he was impeded by Rakitskiy and the referee had no hesitation in pointing to the spot.
Hulk sent the goalkeeper the wrong way but the ball hit the post.
Porto were punished two minutes later when the visitors went ahead following a woeful mistake by Helton in the Porto goal.
Willian fired in a shot which the keeper should have routinely gathered but the ball spilled from his grasp and Adriano pounced to tap home.
With Helton looking uncertain, Porto appeared to be losing the initiative before a thunderbolt from Hulk brought them level in the 28th minute.
The Brazilian lined up a free-kick in a central position from 35 yards and unleashed a vicious shot which moved in the air with goalkeeper Rybka unable to prevent it going into the net despite getting both hands to the ball.
Moments later Porto appeared to have a valid shout for another penalty when Hulk got beyond the defender Henrikh Mkhitaryan and seemed to have been bundled over but nothing was given despite strong appeals.
He then produced another long-range shot which Rybka beat out as the hosts upped the tempo.
Shakhtar's task grew harder when they were reduced to 10 men five minutes before the break when Rakitskiy was shown a straight red card for a lunge on Joao Moutinho.
The hosts then took the lead for the first time in the game six minutes into the second half.
Rodriguez got ahead of the defence on the left wing before cutting a low cross back across the face of goal and Pinheiro Kleber had the simple task of tapping the ball home.
Chygrynskiy was then sent off for his second bookable offence 10 minutes from time to complete a miserable night for Shakhtar.