| /* |
| * 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 ); |
| } |
| |
| } |