The answer depends on assumptions on <code>plaintext</code>. If an adversary can enumerate the possible <code>plaintext</code> (e.g. if <code>plaintext</code> is a password, mediocre passphrase, or a published file) then **yes**: knowledge of <code>h1</code> _or_ <code>h2</code> allows finding what <code>plaintext</code> is, by verifying beyond reasonable doubt an hypothesis made. For some level of protection against that, use a Password-Based Key Derivation Function such as [PBKDF2][1], or better [scrypt][2]. If <code>plaintext</code> can't be guessed (e.g has 128 bits of entropy), then **no**: <code>root</code> and <code>plaintext</code> will not leak, from a practical standpoint. More precisely, we are safe, for some strong enough hypothesis on <code>H</code>, that <code>SHA-256</code> may meet (and meets in practice as far as we know).. or perhaps not (since we have no proof). A suitable hypothesis on <code>H</code> is being computationally indistinguishable from a random function (aside from the length-extension property, and being a particular public function). As pointed in another answer, we'd have the HMAC security argument if we used h1 = HMAC( Hash=SHA-256, Key=root, Message=salt1 ) h2 = HMAC( Hash=SHA-256, Key=root, Message=salt2 ) [1]: http://en.wikipedia.org/wiki/PBKDF2 [2]: http://www.tarsnap.com/scrypt.html