diff --git a/src/sbbs3/str.cpp b/src/sbbs3/str.cpp
index 81d069f449115717c9cef68f94148a680e141ce5..fff7567b4736f1f8d45ab965cb2f897b731b4771 100644
--- a/src/sbbs3/str.cpp
+++ b/src/sbbs3/str.cpp
@@ -849,14 +849,14 @@ bool sbbs_t::inputnstime(time_t *dt)
 bool sbbs_t::chkpass(char *passwd, user_t* user, bool unique)
 {
 	char first[128], last[128], sysop[41], sysname[41], *p;
-	int  c, d;
 	char alias[LEN_ALIAS + 1], name[LEN_NAME + 1], handle[LEN_HANDLE + 1];
 	char pass[LEN_PASS + 1];
 
 	SAFECOPY(pass, passwd);
 	strupr(pass);
 
-	if (strlen(pass) < cfg.min_pwlen) {
+	int len = strlen(pass);
+	if (len < cfg.min_pwlen || len < MIN_PASS_LEN) {
 		bputs(text[PasswordTooShort]);
 		return false;
 	}
@@ -864,26 +864,17 @@ bool sbbs_t::chkpass(char *passwd, user_t* user, bool unique)
 		bputs(text[PasswordNotChanged]);
 		return false;
 	}
-	d = strlen(pass);
-	for (c = 1; c < d; c++)
-		if (pass[c] != pass[c - 1])
-			break;
-	if (c == d) {
-		bputs(text[PasswordInvalid]);
-		return false;
-	}
-	for (c = 0; c < 3; c++)    /* check for 1234 and ABCD */
-		if (pass[c] != pass[c + 1] + 1)
-			break;
-	if (c == 3) {
-		bputs(text[PasswordObvious]);
-		return false;
+	int i;
+	int run = 0;
+	for (i = 0; i < (len - 1); ++i) {
+		if (abs(toupper(pass[i]) - toupper(pass[i + 1])) > 1) {
+			if (++run >= cfg.min_pwlen / 2)
+				break;
+		} else
+			run = 0;
 	}
-	for (c = 0; c < 3; c++)    /* check for 4321 and ZYXW */
-		if (pass[c] != pass[c + 1] - 1)
-			break;
-	if (c == 3) {
-		bputs(text[PasswordObvious]);
+	if (i >= (len - 1)) {
+		bputs(text[PasswordInvalid]);
 		return false;
 	}
 	SAFECOPY(name, user->name);