HMAC-SHA1 BASE64编码 java源代码实现

本文介绍了如何使用Java实现HMAC-SHA1算法并结合BASE64编码,通过示例展示了不同长度密钥下,对特定数据进行加密后的结果,并将自实现的结果与J2SE标准实现进行了对比。
摘要由CSDN通过智能技术生成
研究了RFC2104的说明(中文),原文http://blog.chinaunix.net/u1/38994/showart_2178221.html,如下: 
引用
HMAC的定义。 
         定义HMAC需要一个加密用散列函数(表示为H)和一个密钥K。我们假设H是 
一个将数据块用一个基本的迭代压缩函数来加密的散列函数。我们用B来表示数据块 
的字长。(以上说提到的散列函数的分割数据块字长B=64),用L来表示散列函数的 
输出数据字长(MD5中L=16,SHA—1中L=20)。鉴别密钥的长度可以是小于等于数 
据块字长的任何正整数值。应用程序中使用的密钥长度若是比B大,则首先用使用散列 
函数H作用于它,然后用H输出的L长度字符串作为在HMAC中实际使用的密钥。 
一般情况下,推荐的最小密钥K长度是L个字长。(与H的输出数据长度相等)。更详 
细的信息参见第三部分。 
    我们将定义两个固定且不同的字符串ipad,opad: 
(‘i','o'标志内部与外部) 
        ipad = the byte 0x36 repeated B times 
          opad = the byte 0x5C repeated B times. 
计算‘text'的HMAC: 
           H( K XOR opad, H(K XOR ipad, text)) 
即为以下步骤: 

(1) 在密钥K后面添加0来创建一个子长为B的字符串。(例如,如果K的字长是20 
字节,B=60字节,则K后会加入44个零字节0x00) 

(2) 将上一步生成的B字长的字符串与ipad做异或运算。 

(3) 将数据流text填充至第二步的结果字符串中。 

(4) 用H作用于第三步生成的数据流。 

(5) 将第一步生成的B字长字符串与opad做异或运算。 

(6) 再将第四步的结果填充进第五步的结果中。 

(7) 用H作用于第六步生成的数据流,输出最终结果 
     
基于MD5的相关代码将作为附录提供 

  密钥。 
用于HMAC的密钥可以是任意长度(比B长的密钥将首先被H处理)。但当密钥 
长度小于L时的情况时非常令人失望的,因为这样将降低函数的安全强度。长度大于 
L的密钥是可以接受的,但是额外的长度并不能显著的提高函数的安全强度。(如果一 
个随机的密钥被认为是不可靠的,那么选择一个较长的密钥是明智的)。 
    密钥必须随机选取(或使用强大的基于随机种子的伪随机生成方法),并且要周期 
性的更新。(目前的攻击没有指出一个有效的更换密钥的频率,因为那些攻击实际上并 
不可行。然而,周期性更新密钥是一个对付函数和密钥所存在的潜在缺陷的基本 
的安全措施,并可以降低泄漏密钥带来的危害。) 



代码: 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HMAC-SHA1是一种常用的加密算法,可以使用Java中的javax.crypto库来实现。以下是Java实现HMAC-SHA1加密的示例代码: ```java import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; public class HmacSha1 { public static void main(String[] args) { String text = "hello world"; String key = "secret_key"; String hmacSha1 = hmacSha1(text, key); System.out.println(hmacSha1); } public static String hmacSha1(String text, String key) { try { Mac hmac = Mac.getInstance("HmacSHA1"); SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA1"); hmac.init(secretKey); byte[] digest = hmac.doFinal(text.getBytes()); StringBuilder sb = new StringBuilder(); for (byte b : digest) { sb.append(String.format("%02x", b)); } return sb.toString(); } catch (NoSuchAlgorithmException | InvalidKeyException e) { e.printStackTrace(); return null; } } } ``` 在这个示例中,我们首先定义了一个字符串text和一个密钥key,然后调用hmacSha1方法来获取HMAC-SHA1加密后的结果。在hmacSha1方法中,我们首先使用"javax.crypto.Mac"类获取HmacSHA1算法实例,然后使用密钥初始化该对象。接着,我们调用doFinal方法来计算HMAC-SHA1值,并将结果转换成十六进制字符串返回。 需要注意的是,HMAC-SHA1算法需要一个密钥来进行计算,密钥的长度应该不小于160位(20字节)。在实际应用中,密钥的生成和管理也是非常重要的,需要特别注意。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值