安全问题始终是Web开发中的重中之重服务端与客户端的通信安全用户的信息安全数据服务器的访问安全代码的隐藏问题PKI PMI  SSL TLS 加密技术越来越多小僧在此特立此贴。大家畅所欲言,别把自己当外人啊。都是地球人。呵呵

解决方案 »

  1.   

    web中的安全控制也是层层递进的,不能只在某一处设置安全控制,尽管这会给用户在某些方面带来些影响,但是还是安全第一吗。
      

  2.   

    小僧说的是 安全是重中之重并不是所谓的第一。
    请不要偷换概念。
    小僧也知道一旦和所谓的第一扯上关系,大家就会为了这个东西口水一番。
    没有意义。希望各位感兴趣 有经验的CSDNer 整理下哈PS:其实我挺莫名奇妙滴。我什么时候强调一处的安全设置了。我开的搜集贴 就是搜集web开发体系的安全应用。
      

  3.   

    这里找到一个PKI应用java代码  在这里分享
    keytool -genkey -dname "CN=demo, OU=softDept, O=company, L=puddong,S=shanghai, C=cn" -alias demo -keyalg RSA -keysize 1024 -keystore demoKeystore -validity 3650 -storepass storePwd -keypass demoPwd
    生成保存公钥和私钥的密钥仓库,保存在demoKeystore文件中。这里storepass 和 keypass 不要有java 正则表达式中的特殊字符,否则程序里要转义麻烦。keytool -export -alias demo -keystore demoKeystore -rfc -file demo.cer //从密钥仓库中导出保存公钥的证书
    输入keypass 即demoPwd 
      try{     
       //密钥仓库
       KeyStore ks = KeyStore.getInstance("JKS");
    //读取密钥仓库
       FileInputStream ksfis = new FileInputStream("demoKeystore");
       BufferedInputStream ksbufin = new BufferedInputStream(ksfis);
       char[] storePwd = "storePwd".toCharArray();
       ks.load(ksbufin, storePwd);
       ksbufin.close();
       char[] keyPwd = "demoPwd".toCharArray();
    //从密钥仓库得到私钥
       PrivateKey priK = (PrivateKey) ks.getKey("demo", keyPwd);  
    //生成cipher
       Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding",new org.bouncycastle.jce.provider.BouncyCastleProvider());
    //用私钥初始化cipher
       cipher.init(Cipher.ENCRYPT_MODE, priK);
       byte[] plain = "This is plain text".getBytes("UTF-8");
       
       //因为用的1024位rsa算法,一次只能加密1024/8-11字节数据,分开加密
       byte[] code = new byte[(((plain.length-1)/117+1))*128];  
                int ixplain = 0;
                int ixcode = 0;
                while((plain.length - ixplain) > 117) {//每117字节做一次加密
                    ixcode += cipher.doFinal(plain, ixplain, 117, code, ixcode);
                    ixplain += 117;
                }
                cipher.doFinal(plain, ixplain, plain.length - ixplain, code, ixcode);
                //加密后的code
                System.out.println(Arrays.toString(code));
                //通常会用base64编码
               String base64 = encoder.encode(code);   CertificateFactory certificatefactory = CertificateFactory
         .getInstance("X.509");
       //读取证书
       FileInputStream fin = new FileInputStream("demo.cer");
       X509Certificate certificate = (X509Certificate) certificatefactory
         .generateCertificate(fin);
       fin.close();
       //得到公钥
       PublicKey pubK = certificate.getPublicKey();
             //初始化cipher
                cipher.init(Cipher.DECRYPT_MODE, pubK);
          //base64解码
                code = decoder.decodeBuffer(base64);
                System.out.println(Arrays.toString(code));
                byte[] plain2 = new byte[code.length];
                int ixplain2 = 0;
                int ixcode2 = 0;
                while((code.length - ixcode2) > 128) {//每128字节做一次解密
                    ixplain2 += cipher.doFinal(code, ixcode2, 128, plain2, ixplain2);
                    ixcode2 += 128;
                }
                ixplain2 += cipher.doFinal(code, ixcode2, code.length - ixcode2, plain2, ixplain2);
                String s2 = new String(plain2, 0, ixplain2, "UTF-8");
                System.out.println(s2);
       
      }catch(Exception ex){
       ex.printStackTrace();
      }keytool使用方法可以参考jdk文档
    Java keytool工具的作用及使用方法引用地址 :http://blog.csdn.net/zhanghaooy/archive/2008/10/02/3010107.aspx
      

  4.   

    web开发过程中安全问题越来越重要,我觉得首先还是要从程序本身着手,不要留下明显的安全漏洞。
      

  5.   

    采用安全限制,目前java的web开发大多于采用ssh,基本的可采用 acegi,严格的可单点登录
      

  6.   

    自己还没写过web开发安全技术的加密,我只知道有个ssl,
      

  7.   


    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    import java.util.Random;import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;/**
     * AES 加解密,附加MD5
     **/public class Encryptor {

    /**
     * 对一个字符串进行MD5加密,返回一个加密后的密文
     * @param String pwd
     *        要加密的字符串
     * @return 加密后的字符串
     */
    public static String MD5(String pwd) throws NoSuchAlgorithmException,Exception
    {
    try{
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    md5.update(pwd.getBytes());
    byte[] hash = md5.digest();

    /* 将二进制的字节码转成十六进制的字符串 */
    String result = Base64.getBase64Encode(hash);
    return result;
    }catch(NoSuchAlgorithmException e){
    throw new NoSuchAlgorithmException();
    }catch(Exception ex){
    throw ex;
    }
    }

    public static String AESEncrypt(String pwd,String strEncpt)throws Exception
    {
    try{
                byte[] bytIn = strEncpt.getBytes("UTF8");
                //AES加密
                KeyGenerator kgen = KeyGenerator.getInstance("AES");
                kgen.init(128, new SecureRandom(pwd.getBytes()));
                SecretKey skey = kgen.generateKey();
                byte[] raw = skey.getEncoded();
                SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
                Cipher cipher = Cipher.getInstance("AES");
                cipher.init(Cipher.ENCRYPT_MODE, skeySpec);            byte[] bytOut = cipher.doFinal(bytIn);
                String ecrOut = Base64.getBase64Encode(bytOut);
                return ecrOut; }catch(Exception e){
    e.printStackTrace();
    System.out.println(e.getMessage());
    throw new Exception();
    }
    }

    public static String AESDencrypt(String pwd,String strDencpt)throws Exception
    {
    try{
    byte[] bytIn = Base64.getBase64Dencode(strDencpt);

                //AES加密
                KeyGenerator kgen = KeyGenerator.getInstance("AES");
                kgen.init(128, new SecureRandom(pwd.getBytes()));
                SecretKey skey = kgen.generateKey();
                byte[] raw = skey.getEncoded();
                SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
                Cipher cipher = Cipher.getInstance("AES");
                cipher.init(Cipher.DECRYPT_MODE, skeySpec);            //写文件
                byte[] bytOut = cipher.doFinal(bytIn);
                String ecrOut = new String(bytOut,"UTF8");
                return ecrOut;
    }catch(Exception e){
    e.printStackTrace();
                 throw new Exception();
    }
    }

    /**
     * 生一个长度为len 的随机数
     * @param int len
     *         生成的随机密码的长度
     * @return String pwd
     *         返回生成的随机密码
     */
    public static String getRandomKey(int len)
    {
            StringBuffer buffer = new StringBuffer("123456789");
            StringBuffer pwd = new StringBuffer(); 
            Random r = new Random(); 
            int range = buffer.length(); 
            for (int i = 0; i < len; i ++) {
             int k = Math.abs(r.nextInt(range));
             if(k>=0 && k<range){
                    pwd.append(buffer.charAt(k)); 
             }
            } 
            return pwd.toString(); 
    }


    public static void main(String[] args)
    {
    try{
    //String ms = MD5("12345678");
    String ms = "abcdefg==akl;k/*,";
    System.out.println(ms+"----------------明文");
    String key = getRandomKey(8);
    System.out.println(key+"----------------密钥");
    String ins = AESEncrypt(key,ms);
    System.out.println(ins+"----------------密文");
    String outs = AESDencrypt(key,ins);
    System.out.println(outs+"----------------解后明文");
    }catch(Exception e){
    e.printStackTrace();
    System.out.println("----------------------");
    }
    }
    }
    //字节数组及字符串转换类
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;public class Base64 { public static String encode(byte[] data) {
    StringBuffer sb = new StringBuffer();
    int len = data.length;
    int i = 0;
    int b1, b2; while (i < len) {
    byte ms = data[i];
    b1 = (ms >>> 4) & 0xf;// 高四位
    b2 = ms & 0xf;// 低四位
    sb.append(Integer.toHexString(b1));
    sb.append(Integer.toHexString(b2));
    i++;
    }
    return sb.toString();
    } public static byte[] decode(String str) throws IOException {
    int len = str.length();
    ByteArrayOutputStream buf = new ByteArrayOutputStream(len);
    int i = 0;
    if (len % 2 != 0) {
    throw new IOException("输入的长度只能为偶数!");
    } while (i < len) {
    String tmp_hight = str.substring(i, i + 1);
    String tmp = str.substring(i, i + 2);
    System.out.println(tmp_hight);
    int dec_sign = Integer.parseInt(tmp_hight, 16) >>> 3;
    int dec = 0;
    if (dec_sign == 1) {
    dec = Integer.parseInt(tmp, 16) ^ 0xff;
    dec = dec + 1;
    dec = -dec;
    } else {
    dec = Integer.parseInt(tmp, 16);
    } buf.write(dec);
    i = i + 2;
    }
    return buf.toByteArray();
    } public static String getBase64Encode(byte[] src) throws Exception {
    try {
    return Base64.encode(src);
    } catch (Exception e) {
    e.printStackTrace();
    throw e;
    }
    } public static byte[] getBase64Dencode(String src) throws Exception {
    try {
    return Base64.decode(src);
    } catch (Exception e) {
    e.printStackTrace();
    throw e;
    }
    }}
      

  8.   

    感谢cirgye
    分享了MD5加密方式大家不要把安全看的太片面了 其实对于我们应用开发程序员来说 安全相当滴重要了  
    有些朋友老是捧着 没有绝对的安全 的老话题来说真的没有必要也许有的人到现在仍然就接触不到整体安全问题的设计和编码,借用老某的话  一个都不能少 
    我强调的是安全的重要性,却不是否定其他因素的必要性这个只是个专题贴,我们就谈如何安全,怎么安全,不谈安全必不必要。
      

  9.   

    SSL利用JDK自带keytool实现步骤  在网上找到的 现在不记得出处了 贴出来大家分享实现: JDK里面自带了一个密钥生成工具keytool,可以通过它生成SSL通信需要的密钥对,或者生成自签名的证书。 所有密钥对或者签名证书都是存放在“keystore”密钥仓库中,由它来管理。 下面结合具体例子说明:(java WEB容器:tomcat 5.5) 1,生成服务端密钥仓库, keytool -genkey -alias svrkey -keyalg RSA -keystore c:\svr.jks -validity 365 "alias"是生成的密钥别名,密钥的导入导出都需要由别名来定位。 "keystore"生成的密钥仓库 "validity"生成密钥仓库的有效期(天) 随后会要求输入密钥仓库入口密码,比如: lostsky_11输完密码后,接着会要求一系列的输入,无非是单位,所在地区之类的信息, 但是第一项很重要!为输入服务端域名或IP,如: 192.168.1.3或www.591pic.com 必须与服务器域名或IP相同,否则SSL连接无法建立(这也是SSL通信验证的一部分) 2,在tomcat_home/conf/server.xml中配置: 找到ssl通信配置那一段,加入: keystoreFile="d:\svr.jks" keystorePass="lostsky_11" 服务器启动时会从中寻找用于建立ssl连接的密钥 3,导出服务端证书 keytool -export -alias svrkey -file d:\svr.cer -keystore d:\svr.jks "alias"为想导出的密钥的别名,"file"为导出的证书,"keystore"为存储着导出密钥的仓库 4,生成客户端密钥仓库 keytool -genkey -alias clientkey -keyalg RSA -keystore d:\client.jks 会要求输入仓库密码:如:midsky5,将服务端证书导入到客户端密钥仓库 keytool -import -file d:\svr.cer -keystore d:\client.jks 会要求输入客户端密钥仓库的密码:如上是:midsky这样服务端的密钥仓库就在tomcat部署完毕了, 6,在客户端,每次访问服务端之前,加入 "System.setProperty("javax.net.ssl.trustStore","d:\\client.jks"); System.setProperty("javax.net.ssl.trustStorePassword","midsky"); 

    就把服务端证书添加到了客户端的信任域中,能够完成ssl通信。 注:ssl通信主要验证三个方面: a, 证书是否可信(第6步) b, 证书是否过期(第1步:validity) c, 证书地址是否和当前访问地址符合(第1步) 客户端添加信任域还有编程的动态方法,但是那样会降低通信的安全性,对于证书相对固定的服务,不建议使 用。 以上是客户端对于服务端的验证,这也是SSL默认的实现方式。在这种方式下,每次通信时,发起请求方(如PC 中的BROWSER)都会验证响应方(如某个WEB服务端)的证书是否在己方信任域中,对方的证书是否过期,对方 的域名或IP,是否与信任域中证书记载的一致;不符合其中任何一项,通信都会被拒绝。但反过来,响应方是不 对请求方做任何验证的。所以有些需要双向验证的服务(比如某些服务只能对特定的拥有证书的用户开放),就需 要添加客户端证书,由服务端来验证了,原理和实现与默认模式类似。
      

  10.   


    单点登陆 SSO  个人认为是个易用性的方面为主的东西。关于SSO ,现在大部分软件或引入或自己编写了  java方面 有个著名的开源SSO OpenSSO  哪位有这方面的资料可以发上来分享下 关于如何在项目中引入OpenSSO
    有什么优点 有什么缺点都可以谈谈我之前做过一个,缺没有使用过这个开源的。有她的源代码 可惜一直没有看 
      

  11.   

    感谢楼主..一直在SSL安全相关的信息..终于看到个详细的了...
      

  12.   


    单点登陆,看过一些关于这方面的,但是没有在项目上用过...
    WEB实现主要有两种方式:
    (1)是使用cookie,每次访问时附带上客户信息,然后在服务器恢复客户的个人信息,达到单点登陆的目的.
    (2)是在服务器使用一个代理服务,通过代理生成入场券,用户的每次请求都是通过了代理处理,再将请求转发到真实的服务程序处理并返回.使用Cookies,这种方式最是简单,但是个人认为:不安全.
    通过代理这种方式是安全的,但是实现复杂..关于单点登陆的好处,我只知道两个:
    一个是对于使用者来说,不用去记忆多套的账号及密码,给于用户良好的使用体验;
    另一个是对系统管理员来说,也简化了管理工作,不用在每个系统里设置权限,只要在一个地方设置了权限就OK了..
    这是个人理解,下面,兄弟们补充吧..
      

  13.   

    自己实现安全传输的机制,加密 密码,  数字签名 sessionId.
        也可以直接使用https。
      

  14.   

    国内web这块做的相对较弱,有几个公司真正对客户安全问题去投入人力、财力,大部分就是客户端验证,密码加密,IP限制,证书验证,其他想不出了。
      

  15.   

    能够记录session上下文的应用服务器对web安全有一定的积极意义
      

  16.   

    确实现在接触的关于web安全方面的东西比较少,
    只是在美剧中经常看到各种研究32位或64位加密和解密算法的高手~~
    在这里学习了~~
      

  17.   

    web方面:1 字符串的过滤  2  数据库权限设置  3  服务器方面   4  密码的加密方面   
      

  18.   

    用户身份校验,验证码技术,安全处理异常保护系统内部信息,防止SQL注入,数据库的事务管理和故障恢复,和服务器硬件的相关安全。
      

  19.   

    用户身份校验,验证码技术,安全处理异常保护系统内部信息,防止SQL注入,数据库的事务管理和故障恢复,和服务器硬件的相关安全。
      

  20.   

    http://blog.csdn.net/cnidb/archive/2009/03/23/4018469.aspx
    前段时间配置的单点登录cas,关于什么是cas网上一查便知;
    使用cas,看好的就是cas使用的技术
      

  21.   

    没有绝对的安全,就如代码一样,bug是无法全部找到的,所以产品发布后,肯定能找到漏洞,
      

  22.   

    《权限管理认识的一些误区》里面谈到一些安全知识, 欢迎大家拍砖:
    http://blog.csdn.net/accessmanager88/archive/2009/04/07/4054995.aspx
    (内容有些长,所以就不贴出来了)
      

  23.   

    关注!顺便招人,大型支付网站招安全架构师,目前关注网上安全的同学们来看看1、负责本网站安全框架设计
    2、负责对公司研发项目进行安全评审;
    3、负责本网站产品、服务的安全规范制定、推广、评审;
    4、对开发,测试相关人员进行安全规范的培训,提升规范的可实施性;职位需求: 
    1、熟悉J2EE体系,具备3年以上系统分析,设计经验;
    2、熟悉Web攻防技术及原理,关注业界最新的安全技术发展;
    3、熟悉PKI技术及应用方案、熟悉密码技术;
    4、有良好的沟通能力及组织能力,出色的团队合作精神;
      

  24.   

    http  /https
    登陆IP限制
      

  25.   

    1、权限安全
    使用密码
    Session超时控制
    证书验证
    分角色分权限
    密码加密,如MD5等等(软加密、硬加密)
    Session及超时控制
    2、防恶意攻击
    验证码核对
    HTTPS
    增加拦截器,过滤非法/恶意访问
    IP访问控制3、恶意攻击服务器
    防止SQL注入
      

  26.   

    代码安全:防止SQL注入
    通讯安全:通讯中的帐号或者密码等重要数据加密或者全加密