我目前正在使用jasypt作为加密工具,问题是单词被加密后会生成'/',我想避免在加密中使用斜线。原因是我在自己的网址中使用它。
例如jasypt会生成以下加密文本:
String encryptedText = "/O0sJjPUFgRGfND1TpHrkbyCalgY/rSpE8nhJ/wYjYY=";
我将其添加到链接中。
例如:
String.format("%s%s", "youtube.com/videos/", encryptedText);
这会将我重定向到另一个链接,因此,它不会转到“视频”部分,而是转到 / O0sJjPUFgRGfND1TpHrkbyCalgY
这是我的代码:
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);
}
答案 0 :(得分:2)
第一种(错误的)方法是像下面的线程中那样在url中允许斜杠字符
Encoded slash (%2F) with Spring RequestMapping path param gives HTTP 400
但是我认为使用base64编码您的加密文本似乎没有那么扭曲。 而base64编码确实适合此
在相当冗长的识别期间,Base64编码可能会有所帮助 信息用于HTTP环境。例如,一个数据库 Java对象的持久性框架可能使用Base64编码来 将相对较大的唯一ID(通常为128位UUID)编码为 在HTTP表单或HTTP GET URL中用作HTTP参数的字符串
使用以下代码对加密的文本进行编码:
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);
结果网址为:
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);
}