Hi
I need to write a hash mechanism in CF that replaces on in C#: it accepts a
salt, and the password the user enters, and returns a string.
#Something("rOE3gOJuY/8iZCa0iFmjAQ==", "Sup3rP4sSwORD")# -->
YRsleC9Zqpb8/pk3KEtOcuA2jho=
I've tried a few things, but haven't got it yet, then I thought I'd post it
here, in case there was someone who could just bash it out.
Thanks in advance
Bert
p.s. by way of introduction, its been a few years since I posted here, but
I'm still working on a fusebox app I started in early 2000.
p.p.s. here's the (psuedo) C# code that i need to replicate that I've been
given, along with the comment "pay specific attention on how the base 64
string are directly converted to byte arrays."
class Program { static void Main(string[] args) {
// These values are retrieved from the database. string
userSpecificSaltB64String = "rOE3gOJuY/8iZCa0iFmjAQ=="; string
realPasswordSHA1HashB64String = "YRsleC9Zqpb8/pk3KEtOcuA2jho=";
// This value is the string entered by the user in the login form.
string passwordToValidate = "Sup3rP4sSwORD"; // We write the
result of the IsPasswordValid call. Console.WriteLine(
string.Format( "Is Password Valid: {0}",
IsPasswordValid(passwordToValidate, userSpecificSaltB64String,
realPasswordSHA1HashB64String) ? "YES" : "NO")); // This will
display: // Is Password Valid: YES } /// <summary>
/// Validates if the provided password has the same hash as the one
stored in the database. /// The high level algorithm is to compare
the hash provided in argument (DBPwdHash), retrieved from the DB,
/// with the one we generate thanks to the user specific salt (DBSalt),
also retrieved from the DB, and the provided password (ProvidedPwd) by
following this comparaison pattern: /// DBPwdHash == SHA1(DBSalt +
ProvidedPwd) /// </summary> /// <param
name="passwordToValidate">The password in clear/plain text we want to
validate. This value is provided by the user via the login form.</param>
/// <param name="userSpecificSaltB64String">The base 64 encoded string
of the user specific salt. This value is retrieved from the
database.</param> /// <param
name="realPasswordSHA1HashB64String">The base 64 encoded string of the real
password hash. This value is retrieved from the database.</param>
/// <returns>True is the password is valid (that is, produces the same
hash). False otherwise.</returns> private static bool
IsPasswordValid(string passwordToValidate, string
userSpecificSaltB64String, string realPasswordSHA1HashB64String) {
// We convert the user specific salt from the B64 string (as
stored in the DB) to a byte array. byte[]
userSpecificSaltByteArray =
Convert.FromBase64String(userSpecificSaltB64String); // We
convert the provided password from a clear/plain text string to a byte
array. byte[] passwordToValidateByteArray =
Encoding.Unicode.GetBytes(passwordToValidate); // We contenate
the salt and provided password byte arrays into one
saltAndProvidedPasswordByteArray byte array, in the order salt then
provided password. byte[] saltAndPasswordToValidateByteArray =
new byte[userSpecificSaltByteArray.Length +
passwordToValidateByteArray.Length];
Buffer.BlockCopy(userSpecificSaltByteArray, 0,
saltAndPasswordToValidateByteArray, 0, userSpecificSaltByteArray.Length);
Buffer.BlockCopy(passwordToValidateByteArray, 0,
saltAndPasswordToValidateByteArray, userSpecificSaltByteArray.Length,
passwordToValidateByteArray.Length); // We generate the SHA1
hash of the saltAndProvidedPasswordByteArray byte array. SHA1
sha = new SHA1CryptoServiceProvider(); byte[]
saltAndPasswordToValidateSHA1HashByteArray =
sha.ComputeHash(saltAndPasswordToValidateByteArray); // We
convert the saltAndProvidedPasswordSHA1HashByteArray into a B64 string.
string saltAndPasswordToValidateSHA1HashB64String =
Convert.ToBase64String(saltAndPasswordToValidateSHA1HashByteArray);
// We compare the SHA1 hash generated thanks to the provided password
with the one stored in the database. return
saltAndPasswordToValidateSHA1HashB64String == realPasswordSHA1HashB64String;
} }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Order the Adobe Coldfusion Anthology now!
http://www.amazon.com/Adobe-Coldfusion-Anthology/dp/1430272155/?tag=houseoffusion
Archive:
http://www.houseoffusion.com/groups/cf-talk/message.cfm/messageid:354277
Subscription: http://www.houseoffusion.com/groups/cf-talk/subscribe.cfm
Unsubscribe: http://www.houseoffusion.com/groups/cf-talk/unsubscribe.cfm