提到加密很多人都会第一时间想到MD5,MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。

  MD5还广泛用于加密和解密技术上。比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。

   MD5的加密是单向,他生成一个唯一的字符串.还有其他的加密算法如下:

   BASE64 严格地说,属于编码格式,而非加密算法
    ●  MD5(Message Digest algorithm 5,信息摘要算法)
    ●  SHA(Secure Hash Algorithm,安全散列算法)
    ●  HMAC(Hash Message Authentication Code,散列消息鉴别码)复杂的对称加密(DES、PBE)、非对称加密算法:
    ●  DES(Data Encryption Standard,数据加密算法)
    ●  PBE(Password-based encryption,基于密码验证)
    ●  RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)
    ●  DH(Diffie-Hellman算法,密钥一致协议)
    ●  DSA(Digital Signature Algorithm,数字签名)
    ●  ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)[/size]


本篇内容简要介绍BASE64、MD5、SHA、HMAC几种加密算法。 

    BASE64编码算法不算是真正的加密算法。 

    MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法,我们称之为单向加密算法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。 


BASE64 

按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.) 

常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。



 

主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。 


sun不推荐使用它们自己的base64,所以用apache的挺好!



MD5 

MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文件是否一致的。



 

通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串。 



SHA 

SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了,但是SHA仍然是公认的安全加密算法,较之MD5更为安全。



 

HMAC 

HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。 



 

  BASE64的加密解密是双向的,可以求反解。 

    MD5、SHA以及HMAC是单向加密,任何数据加密后只会产生唯一的一个加密串,通常用来校验数据在传输过程中是否被修改。其中HMAC算法有一个密钥,增强了数据传输过程中的安全性,强化了算法外的不可控因素。[img]http://www.iteye.com/images/smiles/icon_biggrin.gif" alt="[/img] 

    单向加密的用途主要是为了校验数据在传输过程中是否被修改。



代码如下:

java编写密码锁程序 java中密码加密_encryption


    1. import
    2. import
    3. import
    4. import
    5. import
    6. import
    7. import
    8. import
    9. import
    10.   
    11. public class
    12. public static final
    13. public static final
    14. public static final
    15.   
    16.   
    17. // sun不推荐使用它们自己的base64,用apache的挺好
    18. /**
    19. * BASE64解密
    20. */
    21. public static byte[] decryptBASE64(byte[] dest) {  
    22. if (dest == null) {  
    23. return null;  
    24. }  
    25. return
    26. }  
    27.   
    28. /**
    29. * BASE64加密
    30. */
    31. public static byte[] encryptBASE64(byte[] origin) {  
    32. if (origin == null) {  
    33. return null;  
    34. }  
    35. return
    36. }  
    37.   
    38. /**
    39. * MD5加密
    40. * 
    41. * @throws NoSuchAlgorithmException
    42. */
    43. public static byte[] encryptMD5(byte[] data)  
    44. throws
    45. if (data == null) {  
    46. return null;  
    47. }  
    48. MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);  
    49. md5.update(data);  
    50. return
    51. }  
    52.   
    53. /**
    54. * SHA加密
    55. * 
    56. * @throws NoSuchAlgorithmException
    57. */
    58. public static byte[] encryptSHA(byte[] data)  
    59. throws
    60. if (data == null) {  
    61. return null;  
    62. }  
    63. MessageDigest sha = MessageDigest.getInstance(KEY_SHA);  
    64. sha.update(data);  
    65. return
    66. }  
    67.   
    68. /**
    69. * 初始化HMAC密钥
    70. * 
    71. * @throws NoSuchAlgorithmException
    72. */
    73. public static String initMacKey() throws
    74. KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);  
    75. SecretKey secretKey = keyGenerator.generateKey();  
    76. return new
    77. }  
    78.   
    79. /**
    80. * HMAC加密
    81. * 
    82. * @throws NoSuchAlgorithmException
    83. * @throws InvalidKeyException
    84. */
    85. public static byte[] encryptHMAC(byte[] data, String key)  
    86. throws
    87. SecretKey secretKey = new
    88. KEY_MAC);  
    89. Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
    90. mac.init(secretKey);  
    91. return
    92.   
    93. }  
    94.   
    95. public static void main(String[] args) throws
    96. // TODO Auto-generated method stub
    97. String data = "简单加密";  
    98. System.out.println(new BigInteger(encryptBASE64(data.getBytes())).toString(16));  
    99. System.out.println(new BigInteger(encryptBASE64(data.getBytes())).toString(32));  
    100. System.out.println(new
    101.   
    102. System.out.println(new
    103. System.out.println(new
    104.   
    105. System.out.println(new
    106. }  
    107.   
    108. }