SHA1 cracked .... What are the chances this will be addressed in LC?

Peter TB Brett peter.brett at livecode.com
Tue Mar 7 11:04:58 EST 2017



On 07/03/2017 15:28, Bob Sneidar via use-livecode wrote:
> Thanks Peter. But then how will I know programmatically if the password is correct or not?

Hi Bob,

Here's a worked example of what I'm talking about.

                                       Peter

---------------------------------------------------------

/* Compute a hash-based message authentication code
using the SHA-1 hash.  This is broken; it should correctly
follow RFC 2104. */
private function hmacSha1 pKey, pMessage
    return sha1digest(pKey & sha1digest(pKey & pMessage))
end hmacSha1

/* Generate a 160-bit salt value suitable for use when
storing a password */
private function generateSalt
    return randomBytes(20)
end generateSalt

/* Convert the specified cleartext password string to an
secure string suitable for storage using the specified
salt, which should be a base 64-encoded string. */
private function securePassword pPasswordString, pSaltData
    local tPasswordData
    put textEncode(pPasswordString, "UTF-8") into tPasswordData
    return base64Encode(pSaltData) & comma & \
          base64Encode(hmacSha1(pSaltData, tPasswordData))
end securePassword

/* Get the salt part of a secured password string */
private function getSecurePasswordSalt pSecurePassword
    return base64Decode(item 1 of pSecurePassword)
end getSecurePasswordSalt

/* Store a new password.  Use this when a user creates
a new account or changes their password for any reason */
function storePassword pPasswordString
    return securePassword(pPasswordString, generateSalt())
end storePassword

/* Verify a password.  Use this when a user tries to log
in.  Returns true if the password is correct and false
otherwise. */
function verifyPassword pPasswordString, pSecurePassword
    local tSaltData, tTrialString
    put getSecurePasswordSalt(pSecurePassword) into tSaltData
    put securePassword(pPasswordString, tSaltData) into tTrialString
    return tTrialString is pSecurePassword
end verifyPassword

---------------------------------------------------------

private command _testAssert pDesc, pCondition
    if pCondition then
       put "ok -" && pDesc & return after msg
    else
       put "not ok -" && pDesc & return after msg
    end if
end _testAssert

command _testPasswordDemo
    local tSecured
    put storePassword("correct horse battery staple") into tSecured
    put "# Stored:" && tSecured & return into msg
    _testAssert "bad password", \
          not verifyPassword("hunter2", tSecured)
    _testAssert "good password", \
          verifyPassword("correct horse battery staple", tSecured)
end _testPasswordDemo




More information about the use-livecode mailing list