In the first part of this entry, it was shown how its possible that a password from a normal user would significantly be weaker than that from a complex and randomly generated one.
Note: in the strictest sense, there is no such thing as an uncrackable password. Passwords can be uncrackable only in theory, i.e. the mathematical probability of a password being guessed correctly-- no matter how infinitesimally small the odds are, the possibility of a right guess is always present. Also, passwords are uncrackable only technically-- given enormous resources and time any password can be cracked.
Here is a function for a truly random and complex password generator which is based on the formulas given in the first part of this entry:
DELIMITER $$ DROP FUNCTION IF EXISTS `randomPasswordGenerator` $$ CREATE DEFINER=`root`@`localhost` FUNCTION `randomPasswordGenerator`( ) RETURNS varchar(64) CHARSET utf8 BEGIN DECLARE charCount TINYINT(1) DEFAULT 0; DECLARE charDiceRoll TINYINT(2); DECLARE randomChar CHAR(1); DECLARE randomPassword CHAR(8) DEFAULT ''; REPEAT SET charCount = charCount + 1; SET charDiceRoll = 1 + FLOOR(RAND() * 94); IF (charDiceRoll <= 32) THEN SET randomChar = ELT(charDiceRoll, '`', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '=', '_', '+', '[', ']', '{', '}', '\\', '/', '|', '?', ';', ':', '\'', '"', ',', '.', '<', '>'); ELSEIF (charDiceRoll >= 33) AND (charDiceRoll <= 68) THEN SET charDiceRoll = charDiceRoll - 33; SET randomChar = CONV( charDiceRoll, 10, 36); ELSE SET charDiceRoll = charDiceRoll - 59; SET randomChar = LOWER( CONV( charDiceRoll, 10, 36) ); END IF; SET randomPassword = CONCAT(randomPassword, randomChar); UNTIL (charCount = 8) END REPEAT; RETURN randomPassword; END $$ DELIMITER ;
This function will return an 8-character password string. Each character has an equal chance of 1/94 to be generated. Given a short period of time and a normal amount of resources, this qualifies as a theoretical technically uncrackable password. It can be modified to return a longer password length or even a random length, say between 8-12 characters long. A separate user defined function, randomRangePicker(), can be used, if refactoring is desired.
The output can be checked with a simple SELECT statement:
SELECT randomPasswordGenerator();
See the first part of this entry or a similar random string/name generator.