diff --git a/server-spi/src/main/java/org/keycloak/models/ActionTokenKeyModel.java b/server-spi/src/main/java/org/keycloak/models/ActionTokenKeyModel.java
index 2725945..83f0e52 100644
--- a/server-spi/src/main/java/org/keycloak/models/ActionTokenKeyModel.java
+++ b/server-spi/src/main/java/org/keycloak/models/ActionTokenKeyModel.java
@@ -16,6 +16,8 @@
  */
 package org.keycloak.models;
 
+import org.keycloak.common.util.Base64;
+import java.nio.charset.StandardCharsets;
 import java.util.UUID;
 
 /**
@@ -45,6 +47,8 @@ public interface ActionTokenKeyModel {
     UUID getActionVerificationNonce();
 
     default String serializeKey() {
-        return String.format("%s.%d.%s.%s", getUserId(), getExpiration(), getActionVerificationNonce(), getActionId());
+        String userId = getUserId();
+        String encodedUserId = userId == null ? "" : Base64.encodeBytes(userId.getBytes(StandardCharsets.UTF_8));
+        return String.format("%s.%d.%s.%s", encodedUserId, getExpiration(), getActionVerificationNonce(), getActionId());
     }
 }
                 
                
                    
                    diff --git a/services/src/main/java/org/keycloak/authentication/actiontoken/DefaultActionTokenKey.java b/services/src/main/java/org/keycloak/authentication/actiontoken/DefaultActionTokenKey.java
index 9723005..96b817e 100644
--- a/services/src/main/java/org/keycloak/authentication/actiontoken/DefaultActionTokenKey.java
+++ b/services/src/main/java/org/keycloak/authentication/actiontoken/DefaultActionTokenKey.java
@@ -16,11 +16,17 @@
  */
 package org.keycloak.authentication.actiontoken;
 
+import org.keycloak.common.util.Base64;
 import org.keycloak.models.ActionTokenKeyModel;
 import org.keycloak.representations.JsonWebToken;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.util.UUID;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Pattern;
 
 /**
  *
@@ -63,16 +69,24 @@ public class DefaultActionTokenKey extends JsonWebToken implements ActionTokenKe
         return actionVerificationNonce;
     }
 
+    private static final Pattern DOT = Pattern.compile("\\.");
+
     public static DefaultActionTokenKey from(String serializedKey) {
         if (serializedKey == null) {
             return null;
         }
-        String[] parsed = serializedKey.split("\\.", 4);
+        String[] parsed = DOT.split(serializedKey, 4);
         if (parsed.length != 4) {
             return null;
         }
 
-        return new DefaultActionTokenKey(parsed[0], parsed[3], Integer.parseInt(parsed[1]), UUID.fromString(parsed[2]));
+        String userId;
+        try {
+            userId = new String(Base64.decode(parsed[0]), StandardCharsets.UTF_8);
+        } catch (IOException ex) {
+            userId = parsed[0];
+        }
+        return new DefaultActionTokenKey(userId, parsed[3], Integer.parseInt(parsed[1]), UUID.fromString(parsed[2]));
     }
 
 }