Let me just use an answer to explain differences between key-stretching and hashing, even though this isn't an answer to your question.
I'm not going to use a real-world example of collisions, because I don't know what they are, so my hash examples will be purely random.
Imagine your password is pass123, let sha1Result = sha1('pass123')
.
A collision is when bksdajfdjfaskf can also be used, where sha1Result also = sha1('bksdajfdjfaskf')
.
A KDF is a feedback loop, where sha1Result2 = sha1(sha1Result)
and sha1Result3 = sha1(sha1Result2)
and so on n number of times.
The below example KDF()
function will be KDF(password, hash-algorithm, iteration-count)
Let kdfResult = KDF('pass123', SHA1, 100,000)
.
Let kdfResult also = sha1('jadfjlkdfjasldfjskdf')
because we have a collision, sort-of, but not really.
Because in order for you to log into my system, you must pass through my KDF()
, just having a sha1()
collision of my KDF()
does not help you, because I do not sha1()
your supplied cleartext in order to authenticate you, I KDF()
your supplied cleartext, and KDF('jadfjlkdfjasldfjskdf', SHA1, 100,000)
does not match KDF('pass123', SHA1, 100,000)
.
This is a different use-case for a KDF than for HDD encryption. For HDD encryption, the KDF is not used to authenticate, but its used as a key for the encryption of the data.
However, that might be what you should reform your question around. Are the SHA1 collision vulnerabilities still a vulnerability when iterated 103,696 times?