欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-25 23:34:21
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,可以先用非对称加密传递对称加密的密钥,正常的内容用对称加密来传。

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