UTF-8有签名和无签名的区别

当有签名的UTF-8编码内容被解析器解析时,解析器直接根据签名即可判断出使用UTF-8编码来进行解析,当无签名时,解析器会根据内容的编码来进行判别。所以,有签名的将更容易被解析器以正确的编码方式进行解析。

有签名也就是带 BOM 信息,无签名就是不带 BOM。BOM,即 Byte Order Mark,也即字节流标记,它是用来让应用程序识别所用的编码的。UTF-8 的 BOM 是 0xEFBBBF。

如下图:

如果删除开头的字节码将变成无签名。

参考:

http://www.cnblogs.com/zengen/archive/2010/10/25/1860681.html

http://www.cnblogs.com/flying607/p/5999559.html

http://www.cftea.com/c/2009/01/0L9HUPMPMA77NXCT.asp

转载于:https://www.cnblogs.com/EasonJim/p/6198126.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SM3签名是一种基于SM3散列算法的数字签名算法。在Java中,可以使用Bouncy Castle库来实现SM3签名的生成和验证。下面是一个使用UTF-8编码的Java示例: 1. 导入Bouncy Castle库 SM3签名需要使用Bouncy Castle库中的实现类。可以在Maven仓库中添加以下依赖项: ```xml <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.68</version> </dependency> ``` 2. 编写签名和验证方法 ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; import java.nio.charset.StandardCharsets; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Security; import java.security.Signature; public class SM3SignUtil { static { Security.addProvider(new BouncyCastleProvider()); } /** * 生成SM3withSM2签名 * * @param message 待签名的数据 * @param privateKey 私钥 * @return 签名结果 * @throws Exception */ public static String sign(String message, PrivateKey privateKey) throws Exception { Signature signature = Signature.getInstance("SM3withSM2", BouncyCastleProvider.PROVIDER_NAME); signature.initSign(privateKey); signature.update(message.getBytes(StandardCharsets.UTF_8)); byte[] signBytes = signature.sign(); return new String(Hex.encode(signBytes)); } /** * 验证SM3withSM2签名 * * @param message 待验证的数据 * @param sign 签名结果 * @param publicKey 公钥 * @return 验证结果 * @throws Exception */ public static boolean verify(String message, String sign, PublicKey publicKey) throws Exception { Signature signature = Signature.getInstance("SM3withSM2", BouncyCastleProvider.PROVIDER_NAME); signature.initVerify(publicKey); signature.update(message.getBytes(StandardCharsets.UTF_8)); byte[] signBytes = Hex.decode(sign); return signature.verify(signBytes); } /** * 生成SM2密钥对 * * @return 密钥对 * @throws Exception */ public static KeyPair generateKeyPair() throws Exception { KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", BouncyCastleProvider.PROVIDER_NAME); kpg.initialize(256); return kpg.generateKeyPair(); } } ``` 3. 测试签名和验证 ```java public class SM3SignTest { public static void main(String[] args) throws Exception { // 生成密钥对 KeyPair keyPair = SM3SignUtil.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); // 待签名的数据 String message = "Hello, world!"; // 签名 String sign = SM3SignUtil.sign(message, privateKey); System.out.println("签名结果:" + sign); // 验证签名 boolean isValid = SM3SignUtil.verify(message, sign, publicKey); System.out.println("验签结果:" + isValid); } } ``` 以上就是一个简单的使用UTF-8编码的SM3签名示例,如果需要更深入地了解SM3签名的原理和细节,可以参考Bouncy Castle库中的源代码或者相关文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值