I understand the point of "address = RIPEMD160(SHA256(key))"--it combines the security of RIPEMD160 and SHA256, so both hash functions would have to be broken to undo the hash. But what cryptographic reason would there be for "SHA256(SHA256(data))"?
No, infact, taking H(key) = RIPEMD160(SHA256(key)) makes the security of your hash the
worst of the two, in that a collision for EITHER will yield a collision for your hash.
If you have pubkey K and publish your fingerprint as f(g(K)), then clearly, if I can generate a key K' s.t. g(K) = g(K'), we'll have f(g(K)) = f(g(K')). So in your example, clearly if I can collide with SHA256(key), I am also colliding with any further function of that you take.
Similarly if f is weak, I might be able to collide with your fingerprint without actually colliding for g.
Composing hashes gives you security parameter the
minimum of the two. For security parameter the
maximum of the two, you concatenate them, not compose. So you write h(x) = f(x)g(x), not f(g(x)).
edit: to be clear, in the last statement I mean all one can
prove is that the security of the construction is at least as good as the minimum of the two. Specific functions might do better -- e.g. if you compose with the identity function, clearly the security parameter doesn't change.