mise à jour de upassword
This commit is contained in:
parent
9509c955ce
commit
fda97a8289
88
upassword
88
upassword
|
@ -3754,7 +3754,7 @@ public class upassword {
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
public static class Password {
|
public static class Password {
|
||||||
public static final String CLEARTEXT = "", CRYPT = "CRYPT", MD5 = "MD5", SMD5 = "SMD5",
|
public static final String CLEARTEXT = "", CRYPT = "CRYPT", MD5 = "MD5", SMD5 = "SMD5",
|
||||||
SHA = "SHA", SSHA = "SSHA";
|
SHA = "SHA", XSHA = "XSHA", SSHA = "SSHA";
|
||||||
|
|
||||||
public static final String DEFAULT_SCHEME = SSHA;
|
public static final String DEFAULT_SCHEME = SSHA;
|
||||||
|
|
||||||
|
@ -3769,34 +3769,56 @@ public class upassword {
|
||||||
private static final Pattern NORMALIZED_FORMAT = Pattern.compile("\\{.+\\}.+");
|
private static final Pattern NORMALIZED_FORMAT = Pattern.compile("\\{.+\\}.+");
|
||||||
|
|
||||||
public static final boolean isNormalizedFormat(String pw) {
|
public static final boolean isNormalizedFormat(String pw) {
|
||||||
return NORMALIZED_FORMAT.matcher(pw).matches();
|
return pw != null && NORMALIZED_FORMAT.matcher(pw).matches();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final String getNormalizedScheme(String pw) {
|
private static final Pattern XSHA_FORMAT = Pattern.compile("[A-Fa-f0-9]{40}");
|
||||||
|
|
||||||
|
public static final boolean isXshaFormat(String pw) {
|
||||||
|
return pw != null && XSHA_FORMAT.matcher(pw).matches();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final String getNormalizedScheme(String pw, boolean parseXsha) {
|
||||||
if (pw == null) return null;
|
if (pw == null) return null;
|
||||||
if (isNormalizedFormat(pw)) {
|
if (isNormalizedFormat(pw)) {
|
||||||
int p = pw.indexOf('}');
|
int p = pw.indexOf('}');
|
||||||
return strSubstr(pw, 1, p).toUpperCase();
|
return strSubstr(pw, 1, p).toUpperCase();
|
||||||
|
} else if (parseXsha && isXshaFormat(pw)) {
|
||||||
|
return XSHA;
|
||||||
} else {
|
} else {
|
||||||
return CLEARTEXT;
|
return CLEARTEXT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final String getNormalizedPassword(String pw) {
|
public static final String getNormalizedScheme(String pw) {
|
||||||
|
return getNormalizedScheme(pw, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final String getNormalizedPassword(String pw, boolean parseXsha) {
|
||||||
if (pw == null) return null;
|
if (pw == null) return null;
|
||||||
if (isNormalizedFormat(pw)) {
|
if (isNormalizedFormat(pw)) {
|
||||||
int p = pw.indexOf('}');
|
int p = pw.indexOf('}');
|
||||||
return strSubstr(pw, p + 1);
|
return strSubstr(pw, p + 1);
|
||||||
|
} else if (parseXsha && isXshaFormat(pw)) {
|
||||||
|
return pw;
|
||||||
} else {
|
} else {
|
||||||
return pw;
|
return pw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final boolean isClearScheme(String pw) {
|
public static final String getNormalizedPassword(String pw) {
|
||||||
String scheme = getNormalizedScheme(pw);
|
return getNormalizedPassword(pw, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final boolean isClearScheme(String pw, boolean parseXsha) {
|
||||||
|
String scheme = getNormalizedScheme(pw, parseXsha);
|
||||||
return strIsempty(scheme) || CLEARTEXT.equals(scheme);
|
return strIsempty(scheme) || CLEARTEXT.equals(scheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final boolean isClearScheme(String pw) {
|
||||||
|
return isClearScheme(pw, false);
|
||||||
|
}
|
||||||
|
|
||||||
public static final boolean isCryptScheme(String pw) {
|
public static final boolean isCryptScheme(String pw) {
|
||||||
return CRYPT.equals(getNormalizedScheme(pw));
|
return CRYPT.equals(getNormalizedScheme(pw));
|
||||||
}
|
}
|
||||||
|
@ -3813,6 +3835,10 @@ public class upassword {
|
||||||
return SHA.equals(getNormalizedScheme(pw));
|
return SHA.equals(getNormalizedScheme(pw));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final boolean isXshaScheme(String pw) {
|
||||||
|
return XSHA.equals(getNormalizedScheme(pw, true));
|
||||||
|
}
|
||||||
|
|
||||||
public static final boolean isSshaScheme(String pw) {
|
public static final boolean isSshaScheme(String pw) {
|
||||||
return SSHA.equals(getNormalizedScheme(pw));
|
return SSHA.equals(getNormalizedScheme(pw));
|
||||||
}
|
}
|
||||||
|
@ -3852,6 +3878,12 @@ public class upassword {
|
||||||
setScheme(scheme);
|
setScheme(scheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected boolean parseXsha;
|
||||||
|
|
||||||
|
public void setParseXsha(boolean parseXsha) {
|
||||||
|
this.parseXsha = parseXsha;
|
||||||
|
}
|
||||||
|
|
||||||
protected String scheme;
|
protected String scheme;
|
||||||
|
|
||||||
public String getScheme() {
|
public String getScheme() {
|
||||||
|
@ -3886,6 +3918,10 @@ public class upassword {
|
||||||
return SHA.equals(scheme);
|
return SHA.equals(scheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isXshaScheme() {
|
||||||
|
return XSHA.equals(scheme);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isSshaScheme() {
|
public boolean isSshaScheme() {
|
||||||
return SSHA.equals(scheme);
|
return SSHA.equals(scheme);
|
||||||
}
|
}
|
||||||
|
@ -3966,6 +4002,13 @@ public class upassword {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Password setXshaPassword(String pw) {
|
||||||
|
reset(true);
|
||||||
|
scheme = XSHA;
|
||||||
|
crypted = pw;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public Password setSshaPassword(String pw) {
|
public Password setSshaPassword(String pw) {
|
||||||
reset(true);
|
reset(true);
|
||||||
scheme = SSHA;
|
scheme = SSHA;
|
||||||
|
@ -3996,6 +4039,7 @@ public class upassword {
|
||||||
else if (isMd5Scheme()) crypted = Hash.md5(clear);
|
else if (isMd5Scheme()) crypted = Hash.md5(clear);
|
||||||
else if (isSmd5Scheme()) crypted = Hash.smd5(clear, randomBinarySalt());
|
else if (isSmd5Scheme()) crypted = Hash.smd5(clear, randomBinarySalt());
|
||||||
else if (isShaScheme()) crypted = Hash.sha(clear);
|
else if (isShaScheme()) crypted = Hash.sha(clear);
|
||||||
|
else if (isXshaScheme()) crypted = toHex(Hash.sha_bytes(clear));
|
||||||
else if (isSshaScheme()) crypted = Hash.ssha(clear, randomBinarySalt());
|
else if (isSshaScheme()) crypted = Hash.ssha(clear, randomBinarySalt());
|
||||||
else throw new IllegalStateException("Type de cryptage non reconnu: " + scheme);
|
else throw new IllegalStateException("Type de cryptage non reconnu: " + scheme);
|
||||||
}
|
}
|
||||||
|
@ -4026,6 +4070,12 @@ public class upassword {
|
||||||
else return null;
|
else return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getXshaCrypted() {
|
||||||
|
if (isXshaScheme()) return getCrypted();
|
||||||
|
else if (clear != null) return toHex(Hash.sha_bytes(clear));
|
||||||
|
else return null;
|
||||||
|
}
|
||||||
|
|
||||||
public String getSshaCrypted() {
|
public String getSshaCrypted() {
|
||||||
if (isSshaScheme()) return getCrypted();
|
if (isSshaScheme()) return getCrypted();
|
||||||
else if (clear != null) return Hash.ssha(clear, randomBinarySalt());
|
else if (clear != null) return Hash.ssha(clear, randomBinarySalt());
|
||||||
|
@ -4037,6 +4087,7 @@ public class upassword {
|
||||||
public String getNormalized() {
|
public String getNormalized() {
|
||||||
if (normalized == null) {
|
if (normalized == null) {
|
||||||
if (isClearScheme()) normalized = clear;
|
if (isClearScheme()) normalized = clear;
|
||||||
|
else if (isXshaScheme()) normalized = getCrypted();
|
||||||
else normalized = "{" + scheme + "}" + getCrypted();
|
else normalized = "{" + scheme + "}" + getCrypted();
|
||||||
}
|
}
|
||||||
return normalized;
|
return normalized;
|
||||||
|
@ -4046,16 +4097,20 @@ public class upassword {
|
||||||
return getNormalized();
|
return getNormalized();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Password setNormalized(String pw) {
|
public Password setNormalized(String pw, boolean parseXsha) {
|
||||||
reset(true);
|
reset(true);
|
||||||
if (pw == null) {
|
if (pw == null) {
|
||||||
scheme = CLEARTEXT;
|
scheme = CLEARTEXT;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isNormalizedFormat(pw)) {
|
if (isNormalizedFormat(pw)) {
|
||||||
int p = pw.indexOf('}');
|
int p = pw.indexOf('}');
|
||||||
scheme = strSubstr(pw, 1, p).toUpperCase();
|
scheme = strSubstr(pw, 1, p).toUpperCase();
|
||||||
crypted = strSubstr(pw, p + 1);
|
crypted = strSubstr(pw, p + 1);
|
||||||
|
} else if (parseXsha && isXshaFormat(pw)) {
|
||||||
|
scheme = XSHA;
|
||||||
|
crypted = pw;
|
||||||
} else {
|
} else {
|
||||||
scheme = CLEARTEXT;
|
scheme = CLEARTEXT;
|
||||||
clear = pw;
|
clear = pw;
|
||||||
|
@ -4063,6 +4118,10 @@ public class upassword {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Password setNormalized(String pw) {
|
||||||
|
return setNormalized(pw, parseXsha);
|
||||||
|
}
|
||||||
|
|
||||||
private static final String NTLM_DISABLED = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
|
private static final String NTLM_DISABLED = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
|
||||||
|
|
||||||
protected String ntlmHash;
|
protected String ntlmHash;
|
||||||
|
@ -4089,9 +4148,11 @@ public class upassword {
|
||||||
|
|
||||||
public boolean validate(String userPassword) {
|
public boolean validate(String userPassword) {
|
||||||
getNormalized();
|
getNormalized();
|
||||||
|
|
||||||
if (isClearScheme()) {
|
if (isClearScheme()) {
|
||||||
return strEquals(strNotnull(this.clear), strNotnull(userPassword));
|
return strEquals(strNotnull(this.clear), strNotnull(userPassword));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (userPassword == null) return false;
|
if (userPassword == null) return false;
|
||||||
if (isCryptScheme()) {
|
if (isCryptScheme()) {
|
||||||
return Hash.crypt(userPassword, Salt.getCryptSalt(crypted)).equals(crypted);
|
return Hash.crypt(userPassword, Salt.getCryptSalt(crypted)).equals(crypted);
|
||||||
|
@ -4101,6 +4162,8 @@ public class upassword {
|
||||||
return Hash.smd5(userPassword, Salt.getSmd5Salt(crypted)).equals(crypted);
|
return Hash.smd5(userPassword, Salt.getSmd5Salt(crypted)).equals(crypted);
|
||||||
} else if (isShaScheme()) {
|
} else if (isShaScheme()) {
|
||||||
return Hash.sha(userPassword).equals(crypted);
|
return Hash.sha(userPassword).equals(crypted);
|
||||||
|
} else if (isXshaScheme()) {
|
||||||
|
return toHex(Hash.sha_bytes(userPassword)).equals(crypted);
|
||||||
} else if (isSshaScheme()) {
|
} else if (isSshaScheme()) {
|
||||||
return Hash.ssha(userPassword, Salt.getSshaSalt(crypted)).equals(crypted);
|
return Hash.ssha(userPassword, Salt.getSshaSalt(crypted)).equals(crypted);
|
||||||
}
|
}
|
||||||
|
@ -4416,7 +4479,7 @@ public class upassword {
|
||||||
minCounts = tmp;
|
minCounts = tmp;
|
||||||
}
|
}
|
||||||
StringBuffer sb = new StringBuffer();
|
StringBuffer sb = new StringBuffer();
|
||||||
int i = 0;
|
// int i = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
int index;
|
int index;
|
||||||
do {
|
do {
|
||||||
|
@ -4425,7 +4488,7 @@ public class upassword {
|
||||||
String section = sections[index];
|
String section = sections[index];
|
||||||
sb.append(section.charAt(rand.nextInt(section.length())));
|
sb.append(section.charAt(rand.nextInt(section.length())));
|
||||||
minCounts[index]--;
|
minCounts[index]--;
|
||||||
i++;
|
// i++;
|
||||||
boolean done = true;
|
boolean done = true;
|
||||||
for (int j = 0; j < minCounts.length; j++) {
|
for (int j = 0; j < minCounts.length; j++) {
|
||||||
if (minCounts[j] > 0) {
|
if (minCounts[j] > 0) {
|
||||||
|
@ -4795,10 +4858,6 @@ public class upassword {
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final String getShaHex(String sha) {
|
|
||||||
return toHex(Base64.decode(sha.substring("{SHA}".length())));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void run(String[] args) {
|
private void run(String[] args) {
|
||||||
if (args.length == 1 && strEquals(args[0], "--help")) {
|
if (args.length == 1 && strEquals(args[0], "--help")) {
|
||||||
println("USAGE:" //
|
println("USAGE:" //
|
||||||
|
@ -4941,6 +5000,7 @@ public class upassword {
|
||||||
}
|
}
|
||||||
String crypt = getPasswordAnySalt(clear, Password.CRYPT, null).getNormalized();
|
String crypt = getPasswordAnySalt(clear, Password.CRYPT, null).getNormalized();
|
||||||
String sha = getPasswordAnySalt(clear, Password.SHA, null).getNormalized();
|
String sha = getPasswordAnySalt(clear, Password.SHA, null).getNormalized();
|
||||||
|
String xsha = getPasswordAnySalt(clear, Password.XSHA, null).getNormalized();
|
||||||
String ssha = getPasswordAnySalt(clear, Password.SSHA, null).getNormalized();
|
String ssha = getPasswordAnySalt(clear, Password.SSHA, null).getNormalized();
|
||||||
String md5 = getPasswordAnySalt(clear, Password.MD5, null).getNormalized();
|
String md5 = getPasswordAnySalt(clear, Password.MD5, null).getNormalized();
|
||||||
String smd5 = getPasswordAnySalt(clear, Password.SMD5, null).getNormalized();
|
String smd5 = getPasswordAnySalt(clear, Password.SMD5, null).getNormalized();
|
||||||
|
@ -4958,7 +5018,7 @@ public class upassword {
|
||||||
printvar("ntlm", ntlm, shell);
|
printvar("ntlm", ntlm, shell);
|
||||||
printvar("crypt", crypt, shell);
|
printvar("crypt", crypt, shell);
|
||||||
printvar("sha", sha, shell);
|
printvar("sha", sha, shell);
|
||||||
printvar("shahex", getShaHex(sha), shell);
|
printvar("xsha", xsha, shell);
|
||||||
printvar("ssha", ssha, shell);
|
printvar("ssha", ssha, shell);
|
||||||
printvar("md5", md5, shell);
|
printvar("md5", md5, shell);
|
||||||
printvar("smd5", smd5, shell);
|
printvar("smd5", smd5, shell);
|
||||||
|
|
Loading…
Reference in New Issue