all the hashing will do is introduce more randomness
No. You cannot introduce randomness with a deterministic process. You can only introduce randomness with an actual source of random data.
You can use a hash as a component of a pseudorandom generator, and a (cryptographically secure!) pseudorandom generator is good enough for cryptography where randomness is needed, but another vital component of a pseudorandom generator is a secret. That secret is the random generator's state, which is derived from a random seed: a pseudorandom generator doesn't create randomness, it only “multiplies” it in the sense that it can turn a small amount of random data into a large amount of random data.
Hashing a random string only reduces its randomness: it's theoretically possible that two input strings have the same hash (you aren't going to actually find such strings, and we aren't sure they exist, but chances are that they do). The randomness is only reduced by a tiny amount, so this isn't an actual vulnerability in your code, but it is an unnecessary and counterproductive complication.
The way to maximize randomness is to get output from a random generator. Call rng.GetBytes(secretkey)
and stop there.
Converting the key to Base64 for transport and then back to binary for use has no impact on the cryptography. It's just an encoding. Do decode it: using Base64 as a key could reduce security since each byte can only have 1/4 of the possible values. (The way HMAC uses its key, it wouldn't actually matter whether you use base64(random_bytes(64))
or random_bytes(64)
as a key; but this would matter, for example, for an AES key, which wouldn't even have an acceptable length.)