Hmac-SHA1与Base64URLSafe加密

声明:本文纯属个人随手笔记,如果对您有参考价值我十分开心,如果有存在错误,或者有更好的解决办法也麻烦您留言告诉我,大家共同成长,切勿恶言相。 欢迎加入资源共享QQ群:275343679,一起发现知识、了解知识、学习知识、分享知识。

个人网站www.itlantian.top  www.blueskyui.cn

================================================================================

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ObjectUtils;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import com.common.rest.domain.MessageMetaInfo;
import com.common.utils.mapper.JsonMapper;

/**
 * 消息中台接口调用token加密
 *
 * @version 1.0
 * @rule token=appId:hmac-sha1(appSecret,urlsafe-base64(meta)):urlsafe-base64(meta)
 * @date 2017年9月1日
 */
public class MessageTokenUtil {

    private static Logger logger = LoggerFactory.getLogger(MessageTokenUtil.class);
    private String appId;//APP唯一标识
    private String appsecret;//密钥
    private String meta;//为调⽤⽅提供的元数据,格式为json字符串。
    private static final String MAC_NAME = "HmacSHA1";
    private static final String ENCODING = "UTF-8";

    public MessageTokenUtil(String appId, String appsecret, MessageMetaInfo messageMetaInfo) {
        super();
        this.appId = appId;
        this.appsecret = appsecret;
        messageMetaInfo.setIp(getLocalIP());//服务器IP
        messageMetaInfo.setDeadline(System.currentTimeMillis() / 1000 + 3600);//utc时间,为调⽤接⼝时间+3600秒
        this.meta = ObjectUtils.isEmpty(messageMetaInfo) ? null : JsonMapper.toJsonString(messageMetaInfo);
    }

    /**
     * 使用 HMAC-SHA1 签名方法对对encryptText进行签名
     *
     * @param encryptText 被签名的字符串
     * @param encryptKey  密钥
     * @return 返回被加密后的字符串
     * @throws Exception
     */
    public static String HmacSHA1Encrypt(String encryptKey, String encryptText) throws Exception {
        byte[] data = encryptKey.getBytes(ENCODING);
        // 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
        SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
        // 生成一个指定 Mac 算法 的 Mac 对象
        Mac mac = Mac.getInstance(MAC_NAME);
        // 用给定密钥初始化 Mac 对象
        mac.init(secretKey);
        byte[] text = encryptText.getBytes(ENCODING);
        // 完成 Mac 操作
        byte[] digest = mac.doFinal(text);
        StringBuilder sBuilder = bytesToHexString(digest);
        return sBuilder.toString();
    }

    /**
     * 转换成Hex
     *
     * @param bytesArray
     */
    public static StringBuilder bytesToHexString(byte[] bytesArray) {
        if (bytesArray == null) {
            return null;
        }
        StringBuilder sBuilder = new StringBuilder();
        for (byte b : bytesArray) {
            String hv = String.format("%02x", b);
            sBuilder.append(hv);
        }
        return sBuilder;
    }

    //safeUrlBase64Encode加密
    public static String safeUrlBase64Encode(String data) {
        return safeUrlBase64Encode(data.getBytes());
    }

    public static String safeUrlBase64Encode(byte[] data) {
        String encodeBase64 = new BASE64Encoder().encode(data);
        String safeBase64Str = encodeBase64.replace('+', '-');
        safeBase64Str = safeBase64Str.replace('/', '_');
        safeBase64Str = safeBase64Str.replaceAll("=", "");
        return safeBase64Str;
    }

    //safeUrlBase64Encode解密
    public static byte[] safeUrlBase64Decode(final String safeBase64Str) throws IOException {
        String base64Str = safeBase64Str.replace('-', '+');
        base64Str = base64Str.replace('_', '/');
        int mod4 = base64Str.length() % 4;
        if (mod4 > 0) {
            base64Str = base64Str + "====".substring(mod4);
        }
        return new BASE64Decoder().decodeBuffer(base64Str);
    }

    //urlsafe_base64 加密  
    public static String encoded(String data) throws UnsupportedEncodingException {
        byte[] b = Base64.encodeBase64URLSafe(data.getBytes(ENCODING));
        return new String(b, ENCODING);
    }

    //urlsafe_base64 解密  
    public static String decode(String data) throws UnsupportedEncodingException {
        byte[] b = Base64.decodeBase64(data.getBytes(ENCODING));
        return new String(b, ENCODING);
    }

    /**
     * 获取加密token
     *
     * @return
     */
    public String getToken() {
//appId:hmac-sha1(appSecret,urlsafe-base64(meta)):urlsafe-base64(meta)
        try {
            logger.info(String.format("getToken request param:%s", meta));
            String urlsafe_base64_str = safeUrlBase64Encode(meta);
            String hmac_sha1_str = HmacSHA1Encrypt(appsecret, urlsafe_base64_str);
            String toekn = appId + ":" + hmac_sha1_str + ":" + urlsafe_base64_str;
            return toekn;
        } catch (Exception e) {
// TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取本机ip地址,并自动区分Windows还是linux操作系统
     *
     * @return String
     */
    public static String getLocalIP() {
        String sIP = "";
        InetAddress ip = null;
        try {
            //如果是Windows操作系统
            if (isWindowsOS()) {
                ip = InetAddress.getLocalHost();
            } else {
                //如果是Linux操作系统
                boolean bFindIP = false;
                Enumeration<NetworkInterface> netInterfaces = (Enumeration<NetworkInterface>) NetworkInterface
                        .getNetworkInterfaces();
                while (netInterfaces.hasMoreElements()) {
                    if (bFindIP) {
                        break;
                    }
                    NetworkInterface ni = (NetworkInterface) netInterfaces.nextElement();
                    //----------特定情况,可以考虑用ni.getName判断
                    //遍历所有ip
                    Enumeration<InetAddress> ips = ni.getInetAddresses();
                    while (ips.hasMoreElements()) {
                        ip = (InetAddress) ips.nextElement();
                        if (ip.isSiteLocalAddress()
                                && !ip.isLoopbackAddress()   //127.开头的都是lookback地址
                                && ip.getHostAddress().indexOf(":") == -1) {
                            bFindIP = true;
                            break;
                        }
                    }
                }
            }
        } catch (Exception e) {
            logger.error("get ip error.", e);
        }

        if (null != ip) {
            sIP = ip.getHostAddress();
        }
        logger.debug("==========ip:" + sIP);

        return sIP;
    }

    /**
     * 判断系统
     *
     * @return String
     */
    public static boolean isWindowsOS() {
        boolean isWindowsOS = false;
        String osName = System.getProperty("os.name");
        if (osName.toLowerCase().indexOf("windows") > -1) {
            isWindowsOS = true;
        }
        return isWindowsOS;
    }

    public static void main(String[] args) {
        try {
            MessageMetaInfo mmi = new MessageMetaInfo();
            mmi.setIp("10.200.0.1");
            mmi.setModel("test");
            mmi.setDeadline(12345678);
            mmi.setEmail("238236@qq.com");
            mmi.setDesc("desc");
            MessageTokenUtil mtu = new MessageTokenUtil("zdqghwlsvsaqposee", "ulaotbgnsbiunysny", mmi);
            System.out.println(mtu.getToken() + "**" + (System.currentTimeMillis() / 1000 + 3600));

        } catch (Exception e) {
// TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个 Java 实现的示例,可以用于在 HTTP 请求头部中使用 HMAC-SHA256 加密: ```java import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Base64; public class HmacSha256Example { public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException { String secretKey = "your_secret_key"; // 你的密钥 String message = "your_message_to_sign"; // 要签名的消息 String signature = generateHmacSha256Signature(secretKey, message); System.out.println("HMAC-SHA256 signature: " + signature); } private static String generateHmacSha256Signature(String secretKey, String message) throws NoSuchAlgorithmException, InvalidKeyException { String algorithm = "HmacSHA256"; Mac mac = Mac.getInstance(algorithm); SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), algorithm); mac.init(signingKey); byte[] signatureBytes = mac.doFinal(message.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(signatureBytes); } } ``` 在上述示例中,我们首先定义了一个 `secretKey` 和一个 `message`。然后通过 `generateHmacSha256Signature` 方法,使用 `Mac` 类来实现 HMAC-SHA256 加密。最终,我们通过 Base64 编码将签名结果转换成字符串并返回。 注意,这里的 `secretKey` 和 `message` 都是示例数据,你需要将其替换成你自己的数据。另外,这里使用的是 Java 标准库中的 `javax.crypto` 包,你需要确保你的代码中已经引入了这个包。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值