@sawa's answer is fine at getting good speed, but it does make you express your intent a little more awkwardly than Hash#select. Your initial approach would work just fine if the array was a Set with O(1) lookup instead of an array with O(N) lookup.
require 'set' set = array.to_set hash.select { |k,v| set.include?(k) }
This microbenchmark demonstrates sets are fast and this approach is marginally faster than the key-subtraction-delete method @sawa recommended when the set is pre-built and just marginally slower if the set must be made on the fly.
user system total real noop 0.600000 0.020000 0.620000 ( 0.614905) keys_minus_arr_delete 1.190000 0.020000 1.210000 ( 1.213376) select_set_include 1.050000 0.010000 1.060000 ( 1.084079) select_set_include_fly 1.350000 0.020000 1.370000 ( 1.361623) sawa2 1.860000 0.020000 1.880000 ( 1.870162)