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