一、前言
关于log4j2中log4j-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@}