This is probably ambitious and I’ll start with a disclaimer, there is no such thing.
But ok, we know that system/manager isn’t
Apart from system/manager, there are hundreds of weak passwords that are commonly used and easy to guess.
On your database server, after a few tries, the account is lock. And maybe the attacker is detected by then.
So the worst passwords are the default passwords and passwords like oracle.
To enforce good passwords, we have verify functions, like ora12c_strong_verify_function in 12c, that checks for mixed case, special characters, etc. One may prefer to write his own and not disclose what it exactly checks.
In that function in rdbms admin, it states The maximum length of any DB User password is 128 bytes. but it’s 30 character in most cases.
If you have failed login attends of 10, chosing eleven as a password does not make it safe. If the attacker got’s the user metadata, you are screwed in no time. In Oracle 4, it’s clear text. In 7-10, it’s a doubled-DES unsalted with a fixed disclosed key encryption. There any dictionary attack takes milliseconds, and a 6 character password in sub-second. It’s got better in 11, where SHA1 could take weeks to years to have a 8 char password. Depending on its complexity. In 12c, generating a hash cost lot’s of cpu cycle, so it is no longer possible to test millions of password per second, even with the strongest hardware.
But to get a good password it is recommended and often required to use digit / letters / special signs / mixed case and no dictionary word.
I have made a small password generator for my reader using dbms_random.string, which generates pseudorandom string. It is best to use the cryptographically secure dbms_crypto.randombytes, but then you must still get a password that you can type. It should also be possible to use unicode if you like. And depending where you are going to use it, it is sometimes safer to not use signs like * or ‘ because, who know’s, your password may produce an error and end up in a logfile.
Okay, I wrote a small function that generates a 10-char string and verify it with the 12c strong verifier. And loop until one is good enough.
The chance that a random password is manager is pretty low, but it is probably best to check you got not only safe random, but also strong string
CREATE OR REPLACE FUNCTION pw (username VARCHAR2,
old_password VARCHAR2 DEFAULT NULL)
p VARCHAR2 (30);
c BOOLEAN := FALSE;
i NUMBER := 0;
WHILE NOT c AND i < 1000 LOOP p := DBMS_RANDOM.string ('P', 10); i := i + 1; BEGIN c := sys.ora12c_strong_verify_function (username, p, old_PASSWORD); EXCEPTION WHEN OTHERS THEN NULL; END; END LOOP; RETURN p; END; / SELECT pw ('SCOTT', 'TIGER') FROM DUAL; #gA~82NxBv
This could well be a good initial expired password for your user. Later the user will find something easier to remember
Google “password length vs complexity” – I believe you’re much better off generating a 30+ long password using simple letters and numbers, rather than short complex passwords.
Of course, for any database used for non-trivial purposes all the passwords should be generated and stored in a password manager so no-one needs to remember or type them.
Thanks for the input
If both are enforced (via ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION), then generating a random password must be alphanumeric.
But typing 30 characters pro password 100x a day? no thanks 😉
That’s why you use a password manager – any reasonable one will type them for you 🙂