TokenEncryptionService.java

package edu.ucsb.cs156.frontiers.services;

import java.nio.charset.StandardCharsets;
import java.util.Base64;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.crypto.codec.Hex;
import org.springframework.security.crypto.encrypt.AesBytesEncryptor;
import org.springframework.security.crypto.keygen.KeyGenerators;
import org.springframework.stereotype.Service;

@Service
public class TokenEncryptionService {

  private final AesBytesEncryptor encryptor;

  public TokenEncryptionService(@Value("${app.secret}") String secret) {
    byte[] keyBytes = Hex.decode(secret);
    SecretKey key = new SecretKeySpec(keyBytes, "AES");
    this.encryptor =
        new AesBytesEncryptor(
            key, KeyGenerators.secureRandom(12), AesBytesEncryptor.CipherAlgorithm.GCM);
  }

  public String encryptToken(String token) {
    if (token == null || token.isEmpty()) return null;
    byte[] encrypted = encryptor.encrypt(token.getBytes(StandardCharsets.UTF_8));
    return Base64.getEncoder().encodeToString(encrypted);
  }

  public String decryptToken(String encryptedToken) {
    if (encryptedToken == null || encryptedToken.isEmpty()) return null;
    byte[] decrypted = encryptor.decrypt(Base64.getDecoder().decode(encryptedToken));
    return new String(decrypted, StandardCharsets.UTF_8);
  }
}