Java加密和数字签名

  Java加密和数字签名本文主要谈一下密码学中的加密和数字签名 以及其在java中如何进行使用 对密码学有兴趣的伙伴 推荐看 Bruce Schneier的著作 Applied Crypotography 在jdk 的发行版本中安全性方面有了很大的改进 也提供了对RSA算法的直接支持 现在我们从实例入手解决问题(本文仅是作为简单介绍)

  一 密码学上常用的概念 

   )消息摘要

  这是一种与消息认证码结合使用以确保消息完整性的技术 主要使用单向散列函数算法 可用于检验消息的完整性 和通过散列密码直接以文本形式保存等 目前广泛使用的算法有MD MD SHA jdk 对上面都提供了支持 在java中进行消息摘要很简单 java security MessageDigest提供了一个简易的操作方法

  /**    *MessageDigestExample java    *Copyright     */    import java security MessageDigest;    /**    *单一的消息摘要算法 不使用密码 可以用来对明文消息(如 密码)隐藏保存    */    public class MessageDigestExample{     public static void main(String[] args) throws Exception{      if(args length!= ){       System err println( Usage:java MessageDigestExample text );       System exit( );      }

  byte[] plainText=args[ ] getBytes( UTF );

  //使用getInstance( 算法 )来获得消息摘要 这里使用SHA 的 位算法      MessageDigest messageDigest=MessageDigest getInstance( SHA );

  System out println(
+messageDigest getProvider() getInfo());      //开始使用算法      messageDigest update(plainText);      System out println(
Digest: );      //输出算法运算结果      System out println(new String(messageDigest digest() UTF ));     }    }    还可以通过消息认证码来进行加密实现 javax crypto Mac提供了一个解决方案 有兴趣者可以参考相关API文档 本文只是简单介绍什么是摘要算法

  这里补充另一个运用消息摘要的方式加密的例子:    public class TestEncrypt {

  public TestEncrypt() {        }

  /**         * @param strSrc :strSrc is a string will be encrypted          * @param encName : encName is the algorithm name will be used          *                encName dafault to MD          * @return String         */        public String Encrypt(String strSrc String encName) {

  MessageDigest md = null;            String strDes = null;

  byte[] bt = strSrc getBytes();            try {                if (encName == null || encName equals( )) {                    encName = MD ;                }                md = MessageDigest getInstance(encName);                md update(bt);                strDes = bytes Hex(md digest()); //to HexString            }            catch (NoSuchAlgorithmException e) {                System out println( Invalid algorithm );                return null;            }            return strDes;        }

  public String bytes Hex(byte[] bts) {            String des = ;            String tmp = null;            for (int i = ; i < bts length; i++) {                tmp = (Integer toHexString(bts[i] & xFF));                if (tmp length() == ) {                    des += ;                }                des += tmp;            }            return des;        }

  public static void main(String[]args) {            TestEncrypt te = new TestEncrypt();            String strSrc = 可以加密汉字 Oh and english ;            System out println( Source String: + strSrc);            System out println( Encrypted String: );            System out println( Use Def: + te Encrypt(strSrc null));            System out println( Use MD : + te Encrypt(strSrc MD ));            System out println( Use SHA: + te Encrypt(strSrc SHA ));            System out println( Use SHA : + te Encrypt(strSrc SHA ));        }    }

  另外 在javawebparts中的 RequestHelpers里的generateGUID方法也涉及到了MD 的方法 代码如下:    public static String generateGUID(HttpServletRequest request) {

  String out = ;        try {          // Construct a string that is prised of:          // Remote IP Address + Host IP Address + Date (yyyyMMdd) +          // Time (hhmmssSSa) + Requested Path + Session ID +          // HashCode Of ParameterMap          StringBuffer *** = new StringBuffer( );          *** append(request getRemoteAddr());          InetAddress ia = InetAddress getLocalHost();          *** append(ia getHostAddress());          *** append(new SimpleDateFormat( yyyyMMddhhmmssSSa ) format(new Date()));          String path = request getServletPath();          String pathInfo = request getPathInfo();          if (pathInfo != null) {            path += pathInfo;          }          *** append(path);          *** append(request getSession(false));          *** append(request getParameterMap() hashCode());          String str = *** toString();          // Now encode the string using an MD encryption algorithm           MessageDigest md = MessageDigest getInstance( md );          md update(str getBytes());          byte[] digest = md digest();          StringBuffer hexStr = new StringBuffer( );          for (int i = ; i < digest length; i++) {            str = Integer toHexString( xFF & digest[i]);            if (str length() < ) {              str = + str;            }            hexStr append(str);          }          out = hexStr toString();        } catch (NoSuchAlgorithmException nsae) {          log error(nsae);        } catch (UnknownHostException uhe) {          log error(uhe);        }        // Return the encrypted string It should be unique based on the        // ponents that prise the plain text string and should always be        // characters thanks to the MD algorithm         return out;

  } // End generateGUID()

   )私钥加密

  消息摘要只能检查消息的完整性 但是单向的 对明文消息并不能加密 要加密明文的消息的话 就要使用其他的算法 要确保机密性 我们需要使用私钥密码术来交换私有消息

  这种最好理解 使用对称算法 比如 A用一个密钥对一个文件加密 而B读取这个文件的话 则需要和A一样的密钥 双方共享一个私钥(而在web环境下 私钥在传递时容易被侦听)

  使用私钥加密的话 首先需要一个密钥 可用javax crypto KeyGenerator产生一个密钥(java security Key) 然后传递给一个加密工具(javax crypto Cipher) 该工具再使用相应的算法来进行加密 主要对称算法有 DES(实际密钥只用到 位) AES(支持三种密钥长度 位) 通常首先 位 其他的还有DESede等 jdk 种也提供了对对称算法的支持 以下例子使用AES算法来加密

  /**    *PrivateExmaple java    *Copyright     */    import javax crypto Cipher;    import javax crypto KeyGenerator;    import java security Key;

  /**    *私鈅加密 保证消息机密性    */    public class PrivateExample{     public static void main(String[] args) throws Exception{      if(args length!= ){       System err println( Usage:java PrivateExample <text> );       System exit( );      }      byte[] plainText=args[ ] getBytes( UTF );

  //通过KeyGenerator形成一个key      System out println(
Start generate AES key );      KeyGenerator keyGen=KeyGenerator getInstance( AES );      keyGen init( );      Key key=keyGen generateKey();      System out println( Finish generating DES key );

  //获得一个私鈅加密类Cipher ECB是加密方式 PKCS Padding是填充方法      Cipher cipher=Cipher getInstance( AES/ECB/PKCS Padding );      System out println(
+cipher getProvider() getInfo());

  //使用私鈅加密      System out println(
Start encryption: );      cipher init(Cipher ENCRYPT_MODE key);      byte[] cipherText=cipher doFinal(plainText);      System out println( Finish encryption: );      System out println(new String(cipherText UTF ));

  System out println(
Start decryption: );      cipher init(Cipher DECRYPT_MODE key);      byte[] newPlainText=cipher doFinal(cipherText);      System out println( Finish decryption: );

  System out println(new String(newPlainText UTF ));

  }    }

   )公钥加密

  上面提到 私钥加密需要一个共享的密钥 那么如何传递密钥呢?web环境下 直接传递的话很容易被侦听到 幸好有了公钥加密的出现 公钥加密也叫不对称加密 不对称算法使用一对密钥对 一个公钥 一个私钥 使用公钥加密的数据 只有私钥能解开(可用于加密) 同时 使用私钥加密的数据 只有公钥能解开(签名) 但是速度很慢(比私钥加密慢 到 倍) 公钥的主要算法有RSA 还包括Blowfish Diffie Helman等 jdk 种提供了对RSA的支持 是一个改进的地方

  /**    *PublicExample java    *Copyright     */    import java security Key;    import javax crypto Cipher;    import java security KeyPairGenerator;    import java security KeyPair;    /**    *一个简单的公鈅加密例子 Cipher类使用KeyPairGenerator生成的公鈅和私鈅    */    public class PublicExample{     public static void main(String[] args) throws Exception{      if(args length!= ){       System err println( Usage:java PublicExample <text> );       System exit( );      }

  byte[] plainText=args[ ] getBytes( UTF );      //构成一个RSA密钥      System out println(
Start generating RSA key );      KeyPairGenerator keyGen=KeyPairGenerator getInstance( RSA );      keyGen initialize( );      KeyPair key=keyGen generateKeyPair();      System out println( Finish generating RSA key );

  //获得一个RSA的Cipher类 使用公鈅加密      Cipher cipher=Cipher getInstance( RSA/ECB/PKCS Padding );      System out println(
+cipher getProvider() getInfo());

  System out println(
Start encryption );      cipher init(Cipher ENCRYPT_MODE key getPublic());      byte[] cipherText=cipher doFinal(plainText);      System out println( Finish encryption: );      System out println(new String(cipherText UTF ));

lishixinzhi/Article/program/Java/hx/201311/26898



  • 浠涔堟槸鏁板瓧绛惧悕?涓句緥璇存槑姹傝В
    绛旓細鍦ㄧ數瀛愰偖浠朵娇鐢ㄩ绻佺殑缃戠粶鏃朵唬锛屼娇鐢ㄥソ鈥滄暟瀛楃鍚嶁濓紝灏卞儚浼犵粺淇′欢涓殑鈥滄寕鍙蜂俊鈥濓紝鏃犵枒涓虹綉缁滀紶杈撴枃浠剁殑瀹夊叏鍙堝鍔犱簡涓閬撲繚鎶ゅ睆闅溿備緥瀛愯鏄庯細鐜板湪鎴戜滑灏辫浆鍏ユ棰樹簡銆JAVA鐨勬暟瀛楃鍚绫诲皝瑁呭湪Signature绫伙紙java.security.Signature锛変腑銆傛帴涓嬫潵锛屾垜浼氱紪鍐欎笁涓姛鑳斤紙鍗充笁涓Java绫伙級锛...
  • java 鎬庝箞楠岃瘉鏂囦欢涓鏁板瓧绛惧悕璁よ瘉鏂囦欢
    绛旓細锛9锛夎缃柊璇佷功绛惧悕绠楁硶淇℃伅 AlgorithmId algorithm=new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);cinfo2.set(CertificateAlgorithmId.NAME+"."+CertificateAlgorithmId.ALGORITHM,algorithm);锛10锛夊垱寤鸿瘉涔﹀苟浣跨敤CA鐨勭閽ュ鍏剁鍚 X509CertImpl newcert=new X509CertImpl(cinfo2);newcert.sign(caprk...
  • win11瀹夎java6鎻愮ず涓嶈兘瀹夎鏈粡杩鏁板瓧绛惧悕鐨勮蒋浠
    绛旓細win11瀹夎java6鎻愮ず涓嶈兘瀹夎鏈粡杩鏁板瓧绛惧悕鐨勮蒋浠舵槸娌℃湁鏇存柊绯荤粺鏁板瓧绛惧悕銆傛牴鎹煡璇㈢浉鍏冲叕寮淇℃伅鏄剧ず锛寃in11绯荤粺涓畨瑁卝ava6鍓嶉渶鍦ㄧ郴缁熺敤鎴烽厤缃〉闈㈢鐞嗘ā鏉夸腑鏇存柊绯荤粺鏁板瓧绛惧悕锛屽畬鎴愰噸鍚悗鍙甯稿畨瑁卝ava6绋嬪簭銆
  • 鐢java璇█鐢熸垚鏁板瓧绛惧悕瀵嗛挜瀵规瘮鍏朵粬璇█鏉ユ湁浠涔堜紭鍔垮拰涓嶈冻鐨勫湴鏂
    绛旓細鍔犲瘑 鍙槸涓涓畻娉!!鍒颁换浣曡瑷閲岄潰鍙槸鎹簡涓绉嶅啓娉 骞舵病鏈変粈楹 鍖哄埆 鍖哄埆灏辨槸 鐢ㄧ殑鏄粈楹借瑷 java 鐨 杩愯 璧锋潵浼氭參涓浜 鍥犱负 浠栭渶瑕 鍦ㄨ嚜宸辩殑jvm 閲岄潰 瑙f瀽鎵ц 琛ュ厖: 鎬ц兘 鏂规硶 杩欐槸java 鐨勭壒鎬 鍥犱负java 鏂囦欢蹇呴』鍦 jvm(java铏氭嫙鏈)閲岄潰鎵嶈兘琚В鏋 涓嶅儚 鍏朵粬璇█ 鐩存帴 鐢熸垚鏈満浠g爜 鎵浠...
  • java闂
    绛旓細java.security.Signature signet=java.security.Signature.getInstance("DSA");signet.initSign(myprikey);signet.update(myinfo.getBytes());byte[] signed=signet.sign(); //瀵逛俊鎭殑鏁板瓧绛惧悕 System.out.println ("signed(绛惧悕鍐呭)="+byte2hex(signed));//鎶婁俊鎭鍜屾暟瀛楃鍚淇濆瓨鍦ㄤ竴涓枃浠朵腑 ja...
  • 涓轰粈涔java鐨瀹夊叏鎬ф瘮杈冮珮
    绛旓細寮傚父澶勭悊鏈哄埗锛Java寮傚父鏈哄埗涓昏渚濊禆浜巘ry銆乧atch銆乫inally銆乼hrow銆乼hrows浜斾釜鍏抽敭瀛椼傚己鍒剁被鍨嬭浆鎹細鍙湁鍦ㄦ弧瓒冲己鍒惰浆鎹㈣鍒欑殑鎯呭喌涓嬫墠鑳藉己杞垚鍔熴傚簳灞傜殑瀹夊叏鎬у彲浠ヤ粠浠ヤ笅鏂归潰鏉ヨ鏄 Java鍦ㄥ瓧鑺傜爜鐨勪紶杈撹繃绋嬩腑浣跨敤浜嗗叕寮瀵嗛挜鍔犲瘑鏈哄埗(PKC)銆2銆佸湪杩愯鐜鎻愪緵浜嗗洓绾у畨鍏ㄦт繚闅滄満鍒讹細瀛楄妭鐮佹牎楠屽櫒 -绫昏杞藉櫒...
  • 锟ワ骏锟ュ熀浜java璇█鐨鏁板瓧绛惧悕锟ワ骏锟
    绛旓細Java鍔犲瘑鍜屾暟瀛楃鍚缂栫▼蹇熷叆闂 鏈枃涓昏璋堜竴涓嬪瘑鐮佸涓殑鍔犲瘑鍜屾暟瀛楃鍚,浠ュ強鍏跺湪java涓浣曡繘琛屼娇鐢ㄣ傚瀵嗙爜瀛︽湁鍏磋叮鐨勪紮浼,鎺ㄨ崘鐪婤ruce Schneier鐨勮憲浣:Applied Crypotography銆傚湪jdk1.5鐨勫彂琛岀増鏈腑瀹夊叏鎬ф柟闈㈡湁浜嗗緢澶х殑鏀硅繘,涔熸彁渚涗簡瀵筊SA绠楁硶鐨勭洿鎺ユ敮鎸,鐜板湪鎴戜滑浠庡疄渚嬪叆鎵嬭В鍐抽棶棰(鏈枃浠呮槸浣滀负绠鍗曚粙缁): 涓...
  • Java keytool宸ュ叿鐨勪綔鐢ㄥ強浣跨敤鏂规硶
    绛旓細Keytool 鎶婇挜鍖欏拰璇佷功鍌ㄥ瓨鍒颁竴涓猭eystore 榛樹换鐨勫疄鐜発eystore鐨勬槸涓涓枃浠 瀹冪敤涓涓瘑鐮佷繚鎶ら挜鍖 鑰屽彟澶栫殑涓涓伐鍏穓arsigner鐢╧eystore涓殑淇℃伅浜х敓鎴栨楠Java aRchive(jar鏂囦欢)涓殑鏁板瓧绛惧悕 Keystore鏈変袱涓笉鍚岀殑鍏ュ彛:閽ュ寵鍏ュ彛:淇濆瓨浜嗛潪甯告晱鎰熺殑鍔犲瘑鐨勯挜鍖欎俊鎭 骞朵笖鏄敤涓涓繚鎶ょ殑鏍煎紡瀛樺偍浠ラ槻姝㈡湭琚巿鏉...
  • java 娴忚鍣ㄨ闂湇鍔″櫒鐨鏁板瓧绛惧悕閿欒
    绛旓細浣犲畨瑁呬竴涓嬭瘉涔﹁瘯璇曪紝涓嶈繃涓鑸繖鏍蜂笉褰卞搷浣跨敤鐨勶紝涓嶈灏遍噸瑁呭惂
  • 缃戠粶瀹夊叏鎶鏈父鐢ㄦ妧鏈湁鍝簺?
    绛旓細2銆侀槻鐏鎶鏈傞槻鐏鎶鏈槸杩戝勾鍙戝睍璧锋潵鐨勯噸瑕佺綉缁滃畨鍏ㄦ妧鏈紝鍏朵富瑕佷綔鐢ㄦ槸鍦ㄧ綉缁滃叆鍙e妫鏌ョ綉缁滈氫俊锛屾牴鎹敤鎴疯瀹氱殑瀹夊叏瑙勫垯锛屽湪淇濇姢鍐呴儴缃戠粶瀹夊叏鐨勫墠鎻愪笅锛屼繚闅滃唴澶栫綉缁滈氫俊銆傚湪缃戠粶鍑哄彛澶勫畨瑁呴槻鐏鍚庯紝闃茬伀澧欏彲浠ュ鍐呴儴缃戠粶鍜屽閮ㄧ綉缁滆繘琛屾湁鏁堢殑闅旂锛屾墍鏈夋潵鑷閮ㄧ綉缁滅殑璁块棶璇锋眰閮借閫氳繃闃茬伀澧欑殑妫鏌ワ紝鎻愰珮...
  • 扩展阅读:特殊名字生成器免费 ... java对字符串进行加密 ... 密码要求8-16字母和数字 ... java实现md5加密解密 ... 8一16字母和数字组合 ... java密码加密方法 ... 火柴人动态名字复制 ... 加密和数字签名的区别 ... 密码要字母和数字的结合 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网