H(info || msg)
instead of H(msg || info)
There are some good reasons to prefer append to prepend. One practical reason is that---related to what's discussed in the article---if we have to compute two values H(msg || info_1)
H(msg || info_2)
we can do this with just one pass over msg (though admittedly in a non-blackbox way, namely, by saving an intermediate state of the hash computation). In contrast, for a well-designed hash function there should not be any way to save work when computing H(info_1 || msg)
H(info_2 || msg)
and this lack of work savings is one of the reasons we tend to get prehash modes.In addition, prepending to msg comes with a range of subtle security issues. As an example, for Merkle-Damgaard hashes like SHA-2 a proper prefix design needs to pad the prefix to a multiple of H's block length. This is to ensure that msg starts on a block boundary, which means that the hash digests as much of msg as possible in a single invocation of the compression function. Otherwise, if msg is short and it gets broken across a block boundary, this can make meet-in-the-middle--style attacks easier.
In contrast, appending the info string guarantees that msg starts at a block boundary, which is a small nicety. Moreover, one can easily guarantee in a black-box way (and independent of the value/encoding/&c of the info string) that msg ends at a block boundary (just by padding msg). This can be useful as a defense against some kinds of power analysis in the case that msg is a secret [1].
To be sure: appending also requires care---and care is always required when a Merkle-Damgaard hash! (Sponges like SHA-3 are more resistant to misuse.) At the very least, whatever is appended to msg should be prefix-free, and you will likely want to stop length extension attacks and related issues (see [2] for further discussion of this).
But in general my take is that the set of footguns for append is a subset of the prepend ones, and I hope that more folks go towards appending in the future.