All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.datacleaner.util.SecurityUtils Maven / Gradle / Ivy

/**
 * DataCleaner (community edition)
 * Copyright (C) 2014 Free Software Foundation, Inc.
 *
 * This copyrighted material is made available to anyone wishing to use, modify,
 * copy, or redistribute it subject to the terms and conditions of the GNU
 * Lesser General Public License, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution; if not, write to:
 * Free Software Foundation, Inc.
 * 51 Franklin Street, Fifth Floor
 * Boston, MA  02110-1301  USA
 */
package org.datacleaner.util;

import java.security.SecureRandom;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;

import org.apache.http.client.HttpClient;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.datacleaner.util.convert.EncodedStringConverter;
import org.datacleaner.util.ws.NaiveHostnameVerifier;
import org.datacleaner.util.ws.NaiveTrustManager;

/**
 * Utility methods for security concerns.
 */
public class SecurityUtils {
    static final String PREFIX = "enc:";

    private SecurityUtils() {
        // prevent instantiation
    }

    /**
     * Creates a {@link SSLConnectionSocketFactory} which is careless about SSL
     * certificate checks. Use with caution!
     *
     * @return
     */
    @SuppressWarnings("checkstyle:AbbreviationAsWordInName")
    public static SSLConnectionSocketFactory createUnsafeSSLConnectionSocketFactory() {
        try {
            final SSLContextBuilder builder = new SSLContextBuilder();
            builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
            return new SSLConnectionSocketFactory(builder.build(), new NaiveHostnameVerifier());
        } catch (final Exception e) {
            throw new IllegalStateException(e);
        }
    }

    /**
     * Removes the certificate checks of HTTPS traffic on a HTTP client. Use
     * with caution!
     *
     * @param httpClient
     * @throws IllegalStateException
     *
     * @{@link Deprecated} use {@link #createUnsafeSSLConnectionSocketFactory()}
     *         in conjunction with {@link HttpClients#custom()} instead.
     */
    @Deprecated
    public static void removeSshCertificateChecks(final HttpClient httpClient) throws IllegalStateException {
        try {
            // prepare a SSL context which doesn't validate certificates
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            final TrustManager trustManager = new NaiveTrustManager();
            sslContext.init(null, new TrustManager[] { trustManager }, new SecureRandom());

            final org.apache.http.conn.ssl.SSLSocketFactory schemeSocketFactory =
                    new org.apache.http.conn.ssl.SSLSocketFactory(sslContext);
            final org.apache.http.conn.scheme.Scheme sslScheme =
                    new org.apache.http.conn.scheme.Scheme("https", 443, schemeSocketFactory);

            // try again with a new registry
            final org.apache.http.conn.scheme.SchemeRegistry registry =
                    httpClient.getConnectionManager().getSchemeRegistry();
            registry.register(sslScheme);
        } catch (final Exception e) {
            throw new IllegalStateException(e);
        }
    }

    /**
     * Encodes/obfuscates a password. Although this does not prevent actual
     * hacking of password, it does remove the obvious threats of having
     * passwords stored as clear text.
     *
     * @param password
     * @return a String containing the encoded password
     */
    public static String encodePassword(final char[] password) {
        if (password == null) {
            return null;
        }
        final EncodedStringConverter converter = new EncodedStringConverter();
        return converter.toString(new String(password));
    }

    /**
     * Encodes/obfuscates a password. Although this does not prevent actual
     * hacking of password, it does remove the obvious threats of having
     * passwords stored as clear text.
     *
     * @param password
     * @return a String containing the encoded password
     */
    public static String encodePassword(final String password) {
        if (password == null) {
            return null;
        }
        return encodePassword(password.toCharArray());
    }

    /**
     * Decodes/deobfuscates an encoded password. Although this does not prevent
     * actual hacking of password, it does remove the obvious threats of having
     * passwords stored as clear text.
     *
     * @param encodedPassword
     * @return a char array containing the password. Do not use this as a
     *         long-lived object. If the password needs to be held in memory for
     *         longer periods, the encoded version is recommended.
     */
    public static String decodePassword(final String encodedPassword) {
        if (encodedPassword == null) {
            return null;
        }
        final EncodedStringConverter converter = new EncodedStringConverter();
        return converter.fromString(String.class, encodedPassword);
    }

    /**
     * It encodes/obfuscates a password and adds a human readable prefix that clarifies it.
     *
     * @param passwordInPlainText
     * @return a String containing the encoded password
     */
    public static String encodePasswordWithPrefix(final String passwordInPlainText) {
        if (hasPrefix(passwordInPlainText)) {
            return passwordInPlainText;
        }

        return PREFIX + encodePassword(passwordInPlainText);
    }

    /**
     * It decodes/deobfuscates an encoded password with a human readable prefix.
     *
     * @param encodedPasswordWithPrefix
     * @return a String containing the decoded password
     */
    public static String decodePasswordWithPrefix(final String encodedPasswordWithPrefix) {
        if (encodedPasswordWithPrefix == null) {
            return null;
        }
        if (hasPrefix(encodedPasswordWithPrefix)) {
            return decodePassword(encodedPasswordWithPrefix.substring(PREFIX.length()));
        } else {
            return encodedPasswordWithPrefix;
        }
    }

    public static boolean hasPrefix(final String password) {
        if (password == null) {
            return false;
        }
        return password.startsWith(PREFIX);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy