代码之家  ›  专栏  ›  技术社区  ›  KennethC

Jasypt encryption-加密时删除斜杠

  •  1
  • KennethC  · 技术社区  · 6 年前

    我正在使用 jasypt 作为我的加密工具,问题是一旦一个字被加密,它会产生“/”,我想避免在我的加密斜杠。原因是我用它在我的网址。

    例如,jasypt生成加密文本:

    String encryptedText = "/O0sJjPUFgRGfND1TpHrkbyCalgY/rSpE8nhJ/wYjYY=";
    

    我将在我的链接中附加这个。。

    String.format("%s%s", "youtube.com/videos/", encryptedText);
    

    这会将我重定向到另一个链接,所以它不会转到视频部分,而是转到 /O0sjjpufgrgfnd1thrkbycalgy公司

    public class EncryptionUtil {
        public static final String ENCRYPTION_KEY = "test-encryption";
        private static final String EMPTY_KEY_OR_TEXT = "Decryption key and text must not be empty.";
    
        public static String decrypt(final String encryptedText) {
            if (StringUtils.isAnyBlank(encryptedText)) {
                throw new ApiErrorException(EMPTY_KEY_OR_TEXT);
            }
            try {
                final char[] keyCharArray = ENCRYPTION_KEY.toCharArray();
                final BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
                textEncryptor.setPasswordCharArray(keyCharArray);
    
                return textEncryptor.decrypt(encryptedText);
            } catch (EncryptionOperationNotPossibleException e) {
                throw new ApiErrorException(e.getMessage());
            }
        }
    
        public static String encrypt(final String plaintext) {
            if (StringUtils.isAnyBlank(plaintext)) {
                throw new ApiErrorException(EMPTY_KEY_OR_TEXT);
            }
            final char[] keyCharArray = ENCRYPTION_KEY.toCharArray();
            final BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
            textEncryptor.setPasswordCharArray(keyCharArray);
    
            return textEncryptor.encrypt(plaintext);
        }
    }
    

    这是我的弹簧控制器:

    @GetMapping("/profile/client-users/{userId}")
        public ModelAndView getAccountAccess(
            @PathVariable String userId, ModelMap modelMap) {
            userId = EncryptionUtil.decrypt(userId);
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Mumrah81    6 年前

    第一种(不好的)方法是允许像下面的线程那样在url中使用斜杠字符

    Encoded slash (%2F) with Spring RequestMapping path param gives HTTP 400

    但我认为用base64编码加密文本似乎没有那么扭曲。 base64编码非常适合这种情况

    信息在HTTP环境中使用。例如,数据库 将相对较大的唯一id(通常为128位UUID)编码为 在HTTP窗体或HTTP GET URL中用作HTTP参数的字符串

    引自: https://en.wikipedia.org/wiki/Base64

    String encryptedText = "/O0sJjPUFgRGfND1TpHrkbyCalgY/rSpE8nhJ/wYjYY=";
    String encryptedTextAndEncoded = new String(java.util.Base64.getEncoder().encode(encryptedText.getBytes()));
    
    try {
            // Using standard Base64 in URL requires encoding of '+', '/' and '=' 
            encryptedTextAndEncoded = URLEncoder.encode(encryptedTextAndEncoded, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    String.format("%s%s", "youtube.com/videos/", encryptedTextAndEncoded);
    

    生成的url将是:

    youtube.com/videos/L08wc0pqUFVGZ1JHZk5EMVRwSHJrYnlDYWxnWS9yU3BFOG5oSi93WWpZWT0%3D
    

    这是一个完全有效的网址

    @GetMapping("/profile/client-users/{userId}")
        public ModelAndView getAccountAccess(
            @PathVariable String userId, ModelMap modelMap) {
            String decoded = new String(java.util.Base64.getDecoder().decode(userId.getBytes()));
            userId = EncryptionUtil.decrypt(decoded);
    }