当前位置: 移动技术网 > IT编程>开发语言>Java > WebService的用户控制方式与加密算法分类的整理

WebService的用户控制方式与加密算法分类的整理

2017年12月01日  | 移动技术网IT编程  | 我要评论
webservice的用户控制方式与加密算法分类的整理  我们的系统中,所有的webserivce都由权限控制的。记录在此备用! 一、示例ws

webservice的用户控制方式与加密算法分类的整理

 我们的系统中,所有的webserivce都由权限控制的。记录在此备用!

一、示例ws

@service 
@transactional 
@webservice(endpointinterface = "com.mycompany.sms.ws.smsservice", targetnamespace = "http://www.mycompany.cn/sms", servicename = "serviceinstance") 
public class smsserviceimpl implements smsservice { 
 
  private secretkey secretkey; 
 
  @autowired 
  private sessionmanager sessionmanager; 
 
  // 将十六进制数字字符串转成字节流【保持16位】 
  private string hexstr = "3243456789123459"; 
 
  public smsserviceimpl() { 
    byte[] hex = securityhelper.hexstrtobyte(hexstr); 
    secretkey = new secretkeyspec(hex, "des"); 
  } 
 
  @override 
  public string login(string account, string password) { 
    user user = sessionmanager.login(secretkey, account, password); 
    return user.getsessionid(); 
  } 
 
  @override 
  public void logoff(string sessionid) { 
    sessionmanager.logoff(sessionid); 
  } 
 
  @override 
  public boolean sendmessage(string sessionid, string msgnumber, 
      string msgcontent) { 
    sessionmanager.getuser(secretkey, sessionid); 
    do something...; 
    return true; 
  } 
} 

备注:

1.使用时给客户端提供一个用户与密码。用户与密码之间与ws中的key有关。
2.先登录,验证用户与密码,返回sessionid。
3.使用其它function,都要传入sessionid,判断session中有没有这个id,以及secretkey是否相等,貌似这步没啥用。

二、session管理

@component 
public class sessionmanager { 
 
  @autowired 
  private cacheprovider cacheprovider; 
 
  public user login(secretkey secretkey, string account, string password) { 
    securityhelper securityhelper = new securityhelper(secretkey); 
    string password2; 
    try { 
      password2 = securityhelper.bytetohexstr(securityhelper 
          .encode(account.getbytes("utf-8"))); 
    } catch (unsupportedencodingexception e) { 
      throw new loginexception(e); 
    } 
    if (password2.equals(password)) { 
      user user = new user(account); 
      user.setsecretkey(secretkey.getencoded()); 
      addsession(user); 
      return user; 
    } else { 
      throw new loginexception("登录失败"); 
    } 
  } 
 
  public void logoff(string sessionid) { 
    removesession(sessionid); 
  } 
 
  private void addsession(user user) { 
    cacheprovider.put("webservice-session-" + user.getsessionid(), user); 
  } 
 
  private void removesession(string sessionid) { 
    cacheprovider.remove("webservice-session-" + sessionid); 
  } 
 
  public user getuser(secretkey secretkey, string sessionid) { 
    user user = (user) cacheprovider.get("webservice-session-" + sessionid); 
    if (user == null) { 
      throw new wsexception("用户未登录或登录超时"); 
    } else if (!bytesequals(secretkey.getencoded(), user.getsecretkey())) { 
      throw new wsexception("没有调用本接口的权限"); 
    } else { 
      return user; 
    } 
  } 
 
  private boolean bytesequals(byte[] bytes1, byte[] bytes2) { 
    for (int i = 0; i < bytes1.length; i++) { 
      if (bytes1[i] != bytes2[i]) { 
        return false; 
      } 
    } 
    return true; 
  } 
 
} 

备注:

cacheprovider是一个通用的缓存工具接口。

三、加密算法

上面正好看到了des,这里简单汇总一下加密算法:

1.hash

md5、sha1、sha256之类的都是单向hash算法,不能从结果导出原内容,原内容有任何一点变化,hash值都会变化。特点是不可逆。

2.对称加密

des、3des、aes这些,特点是加密与解密用一样的密钥。des老了不安全,aes最新。

3.非对称加密

rsa、ecc(椭圆曲线)这些,特点是不同的密钥,一个公,一个私。一个加的密只能用另一个解密。公加密保证只能私有人看到,私加密保证内容是这个人发的。

4.常用的https,可以先用非对称加密传递对称加密的密钥,正常的内容用对称加密来传。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网