使⽤Base64对URL参数编码
Base64是⼀种任意⼆进制到⽂本字符串的编码⽅法,常⽤于在URL、Cookie、⽹页中传输少量⼆进制数据。
有时候我们在Url传递的参数包含特殊字符“+”,“/”,“=”时,这些字符作为参数是不能正常接收的,或者我们的参数包含了⽤户的信息⽐如⼿机号、⽤户id等,我们不想明⽂显⽰,这时候都可以使⽤base64编码。
编码使⽤到的⼯具类Base64Utils。它是Spring-core中提供的,在spring-core.jar中的org.springframework.util包下,它下⾯常⽤的⼯具类还有:StringUtils、ObjectUtils、NumberUtils等。
⾸先验证⼿机号参数的规范性:
/*校验⼿机号正则表达式*/
final static Pattern PHONE_PATTERN = Patternpile("^1(3[0-9]|4[57]|5[0-35-9]|6[0-9]|7[0-9]|8[0-9]|9[8-9])\\d{8}$");
public static boolean verifyPhone(String tephone){
if (tephone == null || "".equals(tephone)) {
return false;
}
Matcher m = PHONE_PATTERN.matcher(tephone);
return m.matches();
}
验证通过后对⼿机号进⾏编码:
定义⼀个和⼿机号长度11位相同长度的字节数组,数组⾥的字符可以是a-z、0-9的任意字符,并且使⽤异或的规则编码,保证URL解析不发⽣异常采取“url safe”编码⽅式
/**
* 通过⼿机号获取⼿机号对应的编码code
* @param phone
* @return
*/
public static String getLinkByPhone(String phone){
byte []key = {'A','B','C','D','E','F','G','H', 'I', 'J', 'K'};
byte []temp = new byte[11];
if(verifyPhone(phone)){
for (int i = 0; i < phone.length(); i++) {
temp[i] = (byte)(key[i] ^ phone.charAt(i));
}
}
deToUrlSafeString(temp);
}
然后根据编码的规则定义解码规则:
同样,定义⼀个和⼿机号长度11位相同长度的字节数组,为防⽌数组越界抛异常我们需要校验参数的合法性
/**
* 通过编码后的字符获取对应的⼿机号
* @param code
* @return
*/
public static String getPhoneByLink(String code){
byte []temp = new byte[11];
try {
byte []key = {'A','B','C','D','E','F','G','H', 'I', 'J', 'K'};
if(StringUtils.isNotBlank(code)){
byte []phoneByte = Base64Utils.decodeFromUrlSafeString(code);
if(phoneByte != null && phoneByte.length > 0 && phoneByte.length <= 11 ){
for (int i = 0; i < phoneByte.length; i++) {
temp[i] = (byte)(key[i] ^ phoneByte[i]);
}
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
return new String(temp);
}
}
最后运⾏结果:
public static void main(String args[]){
System.out.println("对⼿机号编码后:"+getLinkByPhone("182********"));
System.out.println("解码后的⼿机号:"+getPhoneByLink("cHpxdHV2d3l7eX8="));
}
base64对⼿机号编码解码结果
编码字符串最后的"="是补齐,因为base64编码后的字符长度应该是4的倍数,不⾜的话会使⽤“=”号补齐,如果不喜欢这个“=”号我们可以过滤掉,如下:
public static String getLinkByPhone(String phone){
url编码处理byte []key = {'A','B','C','D','E','F','G','H', 'I', 'J', 'K'};
byte []temp = new byte[11];
if(verifyPhone(phone)){
for (int i = 0; i < phone.length(); i++) {
temp[i] = (byte)(key[i] ^ phone.charAt(i));
}
}
/*去掉最后补齐的=符号*/
String result = deToUrlSafeString(temp);
return result.substring(0,result.length()-1);
}
总结:
Base64编码是从⼆进制到字符的转换过程,并不是真正的加密⽅式,说Base64编码是加密⽅法,只是因为经过Base64编码之后,让⼈⼀眼看上去不知道什么内容⽽已。
关于将⼿机号转换成加密字符串的⽅式还有很多,这⾥只是⼀种⽅法的记录。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论