Изменение конфигурации SL4J или регулярное выражение для маскировки электронной почты (распознаваемой '@' и '.com') в Json - PullRequest
0 голосов
/ 15 мая 2018

Я хочу замаскировать адрес электронной почты в Java из JSON при входе в систему как часть протоколов безопасности. Я пробовал примитивный метод замены с использованием строковых операций, и я не могу выполнить поиск по всему проекту. Есть ли какая-либо возможная конфигурация в SL4J или регулярное выражение является единственным выходом

Если ниже приведен ответ, напечатанный в журнале (slf4j):

{
  "any_key": {

    "salt": "salt_here",
    "sel": "sel_here",
    "rules": [
      {
        "variation": 0,
        "clauses": [
          {
            "attribute": "email",
            "op": "in",
            "values": [
              "jack.jones@gmail.com",
              "david.beckham@yahoo.com"
            ],
            "negate": false
          }
        ]
      }
    ]
  }
}

Он должен распечатать JSON в журнале, как показано ниже:

{
    "any_key": {
    "salt": "salt_here",
    "sel": "sel_here",
    "rules": [
      {
        "variation": 0,
        "clauses": [
          {
            "attribute": "email",
            "op": "in",
            "values": [
              "jac*******@******com",
              "dav**********@******com"
            ],
            "negate": false
          }
        ]
      }
    ]
  }
}

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Мне удалось решить это программно, как показано ниже:

public class Test {

    public static void main(String a[]){
    String result =mask("{\"id\":\"jack.sparrow@pirate.com\"}"); 

    System.out.println(result);

    }
    final static char ASTERICK = '*';
    final static char DOT = '.';
    final static char QUOTATION_MARK = '"';
    final static char ATMARK = '@';


    public static String mask(String jsonString) {
        try {
            if(false)
                return maskEmail(jsonString);

            Matcher m = Pattern.compile("(?=(@))").matcher(jsonString);
            List<Integer> positionList = new ArrayList<Integer>();
            while (m.find()) {
                positionList.add(m.start());
            }
            for (int index = 0; index < positionList.size(); index++) {
                String semiFinalString = maskEmailbeforeAtmark(jsonString,
                        positionList.get(index),ASTERICK);
                String finalString = maskEmailAfterAtmark(semiFinalString,
                        positionList.get(index),ASTERICK);
                jsonString = new String(finalString);
            }
            return jsonString;
        }catch(Exception e) {
            return jsonString;
        }
    }



    /**
     * This method will stark masking before the Atmark(`@`) identifier.
     *
     * @param str
     * @return masked json String.
     * 
     */
    private static String maskEmailbeforeAtmark(String str, int index,char replacementCharacter) throws Exception{
        StringBuffer buff = new StringBuffer(str);
        char[] chars = str.toCharArray();
        loop: for (int i = index - 1; i >= 0; i--) {

            if (chars[i] == QUOTATION_MARK) {
                buff.replace(i+1, i + 2, Character.toString(chars[i + 1]));
                buff.replace(i + 2, i + 3, Character.toString(chars[i + 2]));
                buff.replace(i + 3, i + 4, Character.toString(chars[i + 3]));

                break loop;
            } else {
                buff.replace(i, i + 1, Character.toString(replacementCharacter));
            }
        }
        return buff.toString();
    }

    /**
     * This method will stark masking after the Atmark(`@`) identifier.
     *
     * @param str
     * @return masked json String.
     * 
     */
    private static String maskEmailAfterAtmark(String str, int index,char replacementCharacter) throws Exception{
        StringBuffer buff = new StringBuffer(str);
        char[] chars = str.toCharArray();
        loop: for (int i = index + 1; i <= str.length(); i++) {
            if (chars[i] == DOT)
                break loop;
            else
                buff.replace(i, i + 1, Character.toString(replacementCharacter));
        }
        return buff.toString();
    }

    /**
     * This method mask a part of the email string.
     *
     * @param email
     * @return number
     * 
     */

    private static boolean isJSONValid(String target) {
        try {
            new JSONObject(target);
        } catch (JSONException ex) {
            try {
                new JSONArray(target);
            } catch (JSONException ex1) {
                return false;
            }
        }
        return true;
    }

    private static String maskEmail(String email) throws Exception {

            int start = 0;
            int end = email.length();
            if (start > end)
                return email;

            String semiMaskedString = maskEmailbeforeAtmark("\""+email,email.indexOf(ATMARK)+1,ASTERICK);
            String editedString= semiMaskedString.substring(1, semiMaskedString.length());
            String finalString = maskEmailAfterAtmark(editedString,editedString.indexOf(ATMARK),ASTERICK);
            return finalString;
    }

}
0 голосов
/ 15 мая 2018
(?<=[\"|\']\p{L}{3}).*\@.*(?=com)

Это регулярное выражение обнаружит что-нибудь между \"\p{L}{3} (", за которым следуют три буквы) и com. Затем вы можете повторить совпадение и заменить каждый символ на * (кроме @).

Edit:

Чтобы включить'thing@xyz.com '(som******@****com), используйте обновленное регулярное выражение, теперь допуская \" и \' в качестве разделителей.

https://regex101.com/r/qX1MjR/2

...