{"id":532,"date":"2024-12-05T09:38:31","date_gmt":"2024-12-05T08:38:31","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=532"},"modified":"2025-01-03T09:52:22","modified_gmt":"2025-01-03T08:52:22","slug":"maskieren-von-strings-in-java-verschiedene-ansaetze","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=532","title":{"rendered":"Maskieren von Strings in Java: Verschiedene Ans\u00e4tze"},"content":{"rendered":"\n<p>In der Softwareentwicklung gibt es oft Szenarien, in denen sensible Daten wie Passw\u00f6rter, Kreditkartennummern oder andere pers\u00f6nliche Informationen teilweise maskiert werden m\u00fcssen. Dabei bleibt oft ein Teil der Zeichen (z. B. die letzten vier Ziffern) unmaskiert, w\u00e4hrend der Rest durch Sternchen oder andere Platzhalter ersetzt wird. In diesem Artikel werden verschiedene Ans\u00e4tze vorgestellt, wie man solche Maskierungen in Java umsetzen kann. Dabei wird sowohl auf Methoden eingegangen, die mit Java 8 kompatibel sind, als auch auf L\u00f6sungen, die Funktionen ab Java 17 nutzen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Grundlagen und Anforderungen<\/h4>\n\n\n\n<p>Die Aufgabe besteht darin, einen String so zu maskieren, dass:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Der Anfangsteil des Strings durch ein bestimmtes Zeichen (z. B. <code>*<\/code>) ersetzt wird.<\/li>\n\n\n\n<li>Die letzten n Zeichen unmaskiert bleiben.<\/li>\n<\/ol>\n\n\n\n<p>Beispiel: Aus dem String <code>1234567890<\/code> soll bei einer Maskierung mit Sternchen und n = 4 der String <code>******7890<\/code> entstehen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Maskierungsmethoden in Java 8<\/h3>\n\n\n\n<p>Java 8 bietet grundlegende Funktionen, mit denen diese Aufgabe bew\u00e4ltigt werden kann, wie <code>StringBuilder<\/code>, Schleifen oder regul\u00e4re Ausdr\u00fccke. Diese Methoden sind zwar nicht immer die k\u00fcrzesten, aber effektiv und vielseitig einsetzbar.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. Nutzung von <code>StringBuilder<\/code><\/h4>\n\n\n\n<p>Mit einem <code>StringBuilder<\/code> l\u00e4sst sich die Maskierung manuell umsetzen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-built_in\">String<\/span> maskString(<span class=\"hljs-built_in\">String<\/span> input, int unmaskedLength) {\n    <span class=\"hljs-keyword\">if<\/span> (input == <span class=\"hljs-literal\">null<\/span> || input.length() &lt;= unmaskedLength) {\n        <span class=\"hljs-keyword\">return<\/span> input;\n    }\n    int maskedLength = input.length() - unmaskedLength;\n    StringBuilder maskedString = <span class=\"hljs-keyword\">new<\/span> StringBuilder();\n    <span class=\"hljs-keyword\">for<\/span> (int i = <span class=\"hljs-number\">0<\/span>; i &lt; maskedLength; i++) {\n        maskedString.append(<span class=\"hljs-string\">\"*\"<\/span>);\n    }\n    maskedString.append(input.substring(maskedLength));\n    <span class=\"hljs-keyword\">return<\/span> maskedString.toString();\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Erl\u00e4uterung:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Es wird zuerst die L\u00e4nge der zu maskierenden Zeichen berechnet.<\/li>\n\n\n\n<li>Eine Schleife f\u00fcllt den <code>StringBuilder<\/code> mit Sternchen.<\/li>\n\n\n\n<li>Der unmaskierte Teil wird anschlie\u00dfend angef\u00fcgt.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">2. Verwendung von <code>String.repeat()<\/code> (Optional in Java 11 eingef\u00fchrt)<\/h4>\n\n\n\n<p>Wer Java 11 verwendet, kann den Code mit der Methode <code>String.repeat()<\/code> vereinfachen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-built_in\">String<\/span> maskString(<span class=\"hljs-built_in\">String<\/span> input, int unmaskedLength) {\n    <span class=\"hljs-keyword\">if<\/span> (input == <span class=\"hljs-literal\">null<\/span> || input.length() &lt;= unmaskedLength) {\n        <span class=\"hljs-keyword\">return<\/span> input;\n    }\n    int maskedLength = input.length() - unmaskedLength;\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"*\"<\/span>.repeat(maskedLength) + input.substring(maskedLength);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">3. Einsatz von regul\u00e4ren Ausdr\u00fccken<\/h4>\n\n\n\n<p>Mit regul\u00e4ren Ausdr\u00fccken kann die Maskierung ebenfalls elegant gel\u00f6st werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-built_in\">String<\/span> maskString(<span class=\"hljs-built_in\">String<\/span> input, int unmaskedLength) {\n    <span class=\"hljs-keyword\">if<\/span> (input == <span class=\"hljs-literal\">null<\/span> || input.length() &lt;= unmaskedLength) {\n        <span class=\"hljs-keyword\">return<\/span> input;\n    }\n    int maskedLength = input.length() - unmaskedLength;\n    <span class=\"hljs-keyword\">return<\/span> input.replaceAll(<span class=\"hljs-string\">\".{\"<\/span> + maskedLength + <span class=\"hljs-string\">\"}(?=.{\"<\/span> + unmaskedLength + <span class=\"hljs-string\">\"}$)\"<\/span>, <span class=\"hljs-string\">\"*\"<\/span>);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Erl\u00e4uterung:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Der regul\u00e4re Ausdruck sucht nach den ersten <code>maskedLength<\/code> Zeichen und ersetzt diese durch Sternchen.<\/li>\n\n\n\n<li><code>(?=...)<\/code> ist ein Lookahead, der sicherstellt, dass die letzten <code>unmaskedLength<\/code> Zeichen unber\u00fchrt bleiben.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserte Ans\u00e4tze ab Java 17<\/h3>\n\n\n\n<p>Java 17 bringt Features wie Pattern-Matching f\u00fcr <code>switch<\/code> und Verbesserungen im Bereich String-Handling. Diese k\u00f6nnen genutzt werden, um den Code weiter zu vereinfachen oder lesbarer zu gestalten.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. Verwendung von <code>Text Blocks<\/code><\/h4>\n\n\n\n<p>Mit Textbl\u00f6cken k\u00f6nnen regul\u00e4re Ausdr\u00fccke \u00fcbersichtlicher gestaltet werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> String maskString(String input, int unmaskedLength) {\n    <span class=\"hljs-keyword\">if<\/span> (input == <span class=\"hljs-keyword\">null<\/span> || input.length() &lt;= unmaskedLength) {\n        <span class=\"hljs-keyword\">return<\/span> input;\n    }\n    int maskedLength = input.length() - unmaskedLength;\n    String regex = <span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"\n        .{\"<\/span><span class=\"hljs-string\">\"\"<\/span> + maskedLength + <span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"}(?=.{\"<\/span><span class=\"hljs-string\">\"\"<\/span> + unmaskedLength + <span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"}$)\n        \"<\/span><span class=\"hljs-string\">\"\"<\/span>;\n    <span class=\"hljs-keyword\">return<\/span> input.replaceAll(regex, <span class=\"hljs-string\">\"*\"<\/span>);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">2. Nutzung von <code>Pattern<\/code> und <code>Matcher<\/code><\/h4>\n\n\n\n<p>Ab Java 17 kann die <code>Pattern<\/code>-Klasse mit erweiterten Features kombiniert werden, um regul\u00e4re Ausdr\u00fccke effizient zu handhaben:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> java.util.regex.Pattern;\n<span class=\"hljs-keyword\">import<\/span> java.util.regex.Matcher;\n\npublic <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-built_in\">String<\/span> maskString(<span class=\"hljs-built_in\">String<\/span> input, int unmaskedLength) {\n    <span class=\"hljs-keyword\">if<\/span> (input == <span class=\"hljs-literal\">null<\/span> || input.length() &lt;= unmaskedLength) {\n        <span class=\"hljs-keyword\">return<\/span> input;\n    }\n    int maskedLength = input.length() - unmaskedLength;\n    Pattern pattern = Pattern.compile(<span class=\"hljs-string\">\".{\"<\/span> + maskedLength + <span class=\"hljs-string\">\"}(?=.{\"<\/span> + unmaskedLength + <span class=\"hljs-string\">\"}$)\"<\/span>);\n    Matcher matcher = pattern.matcher(input);\n    <span class=\"hljs-keyword\">return<\/span> matcher.replaceAll(<span class=\"hljs-string\">\"*\"<\/span>);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Erl\u00e4uterung:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Pattern<\/code> und <code>Matcher<\/code> erlauben es, regul\u00e4re Ausdr\u00fccke effizient zu erstellen und mehrfach wiederzuverwenden.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Performance-Vergleich<\/h3>\n\n\n\n<p>Die Performance der verschiedenen Ans\u00e4tze h\u00e4ngt stark von der String-L\u00e4nge und der verwendeten Methode ab. Einige Beobachtungen:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong><code>StringBuilder<\/code><\/strong> ist bei kurzen Strings oft am schnellsten, da er minimalen Overhead hat.<\/li>\n\n\n\n<li><strong>Regul\u00e4re Ausdr\u00fccke<\/strong> k\u00f6nnen bei langen Strings effizient sein, aber sind etwas langsamer bei kleinen Datenmengen.<\/li>\n\n\n\n<li><strong><code>String.repeat()<\/code><\/strong> bietet eine gute Balance zwischen Lesbarkeit und Performance, sofern Java 11+ verwendet wird.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Fazit<\/h3>\n\n\n\n<p>Die Wahl der Methode h\u00e4ngt von der Java-Version, dem Kontext und den pers\u00f6nlichen Vorlieben ab. In Java 8 sind <code>StringBuilder<\/code> und regul\u00e4re Ausdr\u00fccke die wichtigsten Werkzeuge. Ab Java 17 k\u00f6nnen moderne Features wie Text Blocks oder optimierte Regex-Verarbeitung den Code eleganter und lesbarer machen. Entwicklern steht somit eine breite Palette an L\u00f6sungen zur Verf\u00fcgung, um die Maskierung effizient und flexibel umzusetzen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In der Softwareentwicklung gibt es oft Szenarien, in denen sensible Daten wie Passw\u00f6rter, Kreditkartennummern oder andere pers\u00f6nliche Informationen teilweise maskiert werden m\u00fcssen. Dabei bleibt oft ein Teil der Zeichen (z. B. die letzten vier Ziffern) unmaskiert, w\u00e4hrend der Rest durch Sternchen oder andere Platzhalter ersetzt wird. In diesem Artikel werden verschiedene Ans\u00e4tze vorgestellt, wie man [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-532","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/532","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=532"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/532\/revisions"}],"predecessor-version":[{"id":533,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/532\/revisions\/533"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=532"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=532"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}