blob: 24eb43d3fccefac5c5174be46b756ed4cb076afe [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.studio.ldapbrowser.core.model;
import org.apache.directory.api.ldap.model.constants.LdapSecurityConstants;
import org.apache.directory.api.ldap.model.password.PasswordDetails;
import org.apache.directory.api.ldap.model.password.PasswordUtil;
import org.apache.directory.api.util.Strings;
import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
import org.apache.directory.studio.ldifparser.LdifUtils;
/**
* The Password class is used to represent a hashed or plain text password.
* It provides methods to retrieve information about the used hash method.
* And it provides a verify method to check if the hashed password is equal to
* a given plain text password.
*
* The following hash methods are supported:
* <ul>
* <li>SHA</li>
* <li>SSHA</li>
* <li>SHA-256</li>
* <li>SSHA-256</li>
* <li>SHA-384</li>
* <li>SSHA-384</li>
* <li>SHA-512</li>
* <li>SSHA-512</li>
* <li>MD5</li>
* <li>SMD5</li>
* <li>PKCS5S2</li>
* <li>CRYPT</li>
* </ul>
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class Password
{
/** The password, either plain text or in encrypted format */
private final byte[] password;
/** The password details */
private final PasswordDetails passwordDetails;
/**
* Creates a new instance of Password.
*
* @param password the password, either hashed or plain text
*/
public Password( byte[] password )
{
if ( password == null )
{
throw new IllegalArgumentException( BrowserCoreMessages.model__empty_password );
}
else
{
this.password = password;
this.passwordDetails = PasswordUtil.splitCredentials( password );
}
}
/**
* Creates a new instance of Password.
*
* @param password the password, either hashed or plain text
*/
public Password( String password )
{
if ( password == null )
{
throw new IllegalArgumentException( BrowserCoreMessages.model__empty_password );
}
else
{
this.password = Strings.getBytesUtf8( password );
this.passwordDetails = PasswordUtil.splitCredentials( this.password );
}
}
/**
* Creates a new instance of Password and calculates the hashed password.
*
* @param hashMethod the hash method to use
* @param passwordAsPlaintext the plain text password
*
* @throws IllegalArgumentException if the given password is null
*/
public Password( LdapSecurityConstants hashMethod, String passwordAsPlaintext )
{
if ( passwordAsPlaintext == null )
{
throw new IllegalArgumentException( BrowserCoreMessages.model__empty_password );
}
else
{
this.password = PasswordUtil.createStoragePassword( passwordAsPlaintext, hashMethod );
this.passwordDetails = PasswordUtil.splitCredentials( this.password );
}
}
/**
* Verifies if this password is equal to the given test password.
*
* @param testPasswordAsPlaintext the test password as plaintext
*
* @return true, if equal
*/
public boolean verify( String testPasswordAsPlaintext )
{
if ( testPasswordAsPlaintext == null )
{
return false;
}
return PasswordUtil.compareCredentials( Strings.getBytesUtf8( testPasswordAsPlaintext ), this.password );
}
/**
* Gets the hash method.
*
* @return the hash method
*/
public LdapSecurityConstants getHashMethod()
{
return passwordDetails.getAlgorithm();
}
/**
* Gets the hashed password.
*
* @return the hashed password
*/
public byte[] getHashedPassword()
{
return passwordDetails.getPassword();
}
/**
* Gets the hashed password as hex string.
*
* @return the hashed password as hex string
*/
public String getHashedPasswordAsHexString()
{
return LdifUtils.hexEncode( passwordDetails.getPassword() );
}
/**
* Gets the salt.
*
* @return the salt
*/
public byte[] getSalt()
{
return passwordDetails.getSalt();
}
/**
* Gets the salt as hex string.
*
* @return the salt as hex string
*/
public String getSaltAsHexString()
{
return LdifUtils.hexEncode( passwordDetails.getSalt() );
}
/**
* Gets the
*
* @return the byte[]
*/
public byte[] toBytes()
{
return LdifUtils.utf8encode( toString() );
}
/**
* @see java.lang.Object#toString()
*/
public String toString()
{
return Strings.utf8ToString( password );
}
}