首页

关于Log4j2源码包中StringEncoder字符串加密类将字符char映射转换byte算法源码分析说明

标签:StringEncoder,字符串加密,log4j2     发布时间:2018-04-06   

一、前言

关于log4j2log4j-core源码包org.apache.logging.log4j.core.util.StringEncoder字符串加密类,,通过字符映射为二进制byte进行转换加密,进而将字符串都通过这种方式转换加密toBytes,具体参见源码说明。

二、源码说明

package org.apache.logging.log4j.core.util;@b@@b@import java.io.UnsupportedEncodingException;@b@import java.nio.charset.Charset;@b@import java.nio.charset.StandardCharsets;@b@@b@/**@b@ * Encodes Strings to bytes.@b@ *@b@ * @since 2.5@b@ */@b@public final class StringEncoder {@b@@b@    private StringEncoder() {@b@    }@b@@b@    /**@b@     * Converts a String to a byte[].@b@     *@b@     * @param str if null, return null.@b@     * @param charset if null, use the default charset.@b@     * @return a byte[]@b@     */@b@    public static byte[] toBytes(final String str, final Charset charset) {@b@        if (str != null) {@b@            if (StandardCharsets.ISO_8859_1.equals(charset)) {@b@                return encodeSingleByteChars(str);@b@            }@b@            final Charset actual = charset != null ? charset : Charset.defaultCharset();@b@            try { // LOG4J2-935: String.getBytes(String) gives better performance@b@                return str.getBytes(actual.name());@b@            } catch (final UnsupportedEncodingException e) {@b@                return str.getBytes(actual);@b@            }@b@        }@b@        return null;@b@    }@b@@b@    /**@b@     * Encodes the specified char sequence by casting each character to a byte.@b@     *@b@     * @param s the char sequence to encode@b@     * @return the encoded String@b@     * @see <a href="https://issues.apache.org/jira/browse/LOG4J2-1151">LOG4J2-1151</a>@b@     */@b@    public static byte[] encodeSingleByteChars(final CharSequence s) {@b@        final int length = s.length();@b@        final byte[] result = new byte[length];@b@        encodeString(s, 0, length, result);@b@        return result;@b@    }@b@@b@    // LOG4J2-1151@b@    /*@b@     * Implementation note: this is the fast path. If the char array contains only ISO-8859-1 characters, all the work@b@     * will be done here.@b@     */@b@    public static int encodeIsoChars(final CharSequence charArray, int charIndex, final byte[] byteArray, int byteIndex, final int length) {@b@        int i = 0;@b@        for (; i < length; i++) {@b@            final char c = charArray.charAt(charIndex++);@b@            if (c > 255) {@b@                break;@b@            }@b@            byteArray[(byteIndex++)] = ((byte) c);@b@        }@b@        return i;@b@    }@b@@b@    // LOG4J2-1151@b@    public static int encodeString(final CharSequence charArray, int charOffset, int charLength, final byte[] byteArray) {@b@        int byteOffset = 0;@b@        int length = Math.min(charLength, byteArray.length);@b@        int charDoneIndex = charOffset + length;@b@        while (charOffset < charDoneIndex) {@b@            final int done = encodeIsoChars(charArray, charOffset, byteArray, byteOffset, length);@b@            charOffset += done;@b@            byteOffset += done;@b@            if (done != length) {@b@                final char c = charArray.charAt(charOffset++);@b@                if ((Character.isHighSurrogate(c)) && (charOffset < charDoneIndex)@b@                        && (Character.isLowSurrogate(charArray.charAt(charOffset)))) {@b@                    if (charLength > byteArray.length) {@b@                        charDoneIndex++;@b@                        charLength--;@b@                    }@b@                    charOffset++;@b@                }@b@                byteArray[(byteOffset++)] = '?';@b@                length = Math.min(charDoneIndex - charOffset, byteArray.length - byteOffset);@b@            }@b@        }@b@        return byteOffset;@b@    }@b@}