UTF-8带签名与不带签名

在 Visual Web Developer 另存为文件时,有编码选项,其中有:

  • Unicode (UTF-8 with signature) - Codepage 65001
  • Unicode (UTF-8 without signature) - Codepage 65001

这两个都是 UTF-8,一个带签名,一个不带签名,有什么区别呢?

带签名也就是带 BOM 信息,不带签名就是不带 BOM。

如果这个网页是用来被别人包含的,如 ASP 中的 include,那么这个网页就不要带签名,否则输出网页时,二进制流中会有两个 BOM 信息(包含页一个,被包含页一个),可能会发生错误。

名称解释

BOM,即 Byte Order Mark,也即字节流标记,它是用来让应用程序识别所用的编码的。UTF-8 的 BOM 是 0xEFBBBF。

如果用文本编辑工具EditPlus打开,带签名的文件会显示编码为utf-8 + ,不带签名的显示 utf- 8

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值