Comments (19)
我公司 arm kylin v10 的服务器上 openssl 版本是 1.1.1f,生成的国密公私钥OID就是
1.2.156.10197.1.301
,可是坑了我一把。😂
这个算是个bug,升级到openssl最新版本就能解决。
相关issue在这里,有过不少讨论
openssl/openssl#20973
from hutool.
@CherryRum 你要自己实现么,哈哈
from hutool.
看看有啥问题 哈哈,明确下文档
from hutool.
public KeyInfo generate() {
KeyPair keyPair = SecureUtil.generateKeyPair("SM2");
// 获取公钥和私钥
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
KeyInfo keyInfo = new KeyInfo();
keyInfo.setPublicKeyStr(Base64.getEncoder().encodeToString(publicKey.getEncoded()));
keyInfo.setPrivateKeyStr(Base64.getEncoder().encodeToString(privateKey.getEncoded()));
return keyInfo;
}
![image](https://private-user-images.githubusercontent.com/49056040/345357302-50a5d37e-4f38-4e94-bfcc-3cf45f0d6ce3.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYwNTUyNjQsIm5iZiI6MTcyNjA1NDk2NCwicGF0aCI6Ii80OTA1NjA0MC8zNDUzNTczMDItNTBhNWQzN2UtNGYzOC00ZTk0LWJmY2MtM2NmNDVmMGQ2Y2UzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTExVDExNDI0NFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWIwYzJlZTYwOTk0NmI4M2Q3ZmIxYzVhOGU4YThhNDJkZGYzNjAwMTFhYWYzOTAzZWIxZTc3NmQ4Njg1OWUyZDImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.dGPCOg09FiwLRMIJk4KnsZ1yNHYM3dD8fW0_sxhHmOI)
最近在对接国密,想咨询下hutool生成的国密密钥对的私钥算法标识符是使用的1.2.840.10045.2.1
ANSI X9.62 国际标准吗?
在使用openssl如下命令生成的国密密钥对的私钥算法标识符是使用的1.2.156.10197.1.301
**国家商用密码标准。因为也是第一次接触,客户要求使用国密,我理解这两种都是ECC(椭圆曲线密码学)的实现,请教下用哪一种更符合所谓国密的规范呢?
openssl ecparam -genkey -name SM2 -out "sm2PrivateKey.pem"
![image](https://private-user-images.githubusercontent.com/49056040/345357553-05d386cd-876b-4129-a795-f0088742ee4a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYwNTUyNjQsIm5iZiI6MTcyNjA1NDk2NCwicGF0aCI6Ii80OTA1NjA0MC8zNDUzNTc1NTMtMDVkMzg2Y2QtODc2Yi00MTI5LWE3OTUtZjAwODg3NDJlZTRhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTExVDExNDI0NFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWM2ZGJjNTg2M2E2YzU0ZTY0NDdjYTFiYmY1NWM0NGNjNWM5N2E5ZmI2YmYzOWM0YThhNmUzZDJlOWJjNTEzNWYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.bj3M2lb4ytv2KlR9xSYwWkcSBifJ1ccVAc0YoRocQm0)
from hutool.
@cxhello 密钥格式的问题。
Hutool中使用密钥支持:
私钥:支持D值、PKCS#8、PKCS#1
公钥:支持Q值、X.509、PKCS#1
密钥标识符使用的是:1.2.156.10197.1.301
见:
from hutool.
@looly 您说的密钥格式的问题,是指的我使用openssl命令不对是吗?
from hutool.
@cxhello 我意思是国密的Oid是固定的,只是密钥存储的格式不同。
如果在使用中有问题,可以附上测试的密钥,我这边回复。
from hutool.
证书解析网址:https://lapo.it/asn1js
![image](https://private-user-images.githubusercontent.com/49056040/345382393-88098e56-07e9-4ecc-b382-f5e4a0f78eb2.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYwNTUyNjQsIm5iZiI6MTcyNjA1NDk2NCwicGF0aCI6Ii80OTA1NjA0MC8zNDUzODIzOTMtODgwOThlNTYtMDdlOS00ZWNjLWIzODItZjVlNGEwZjc4ZWIyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTExVDExNDI0NFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWMzNTM5MjdiYTllOWEyM2Y2ZmFhZmM1YWM5ZTk1MjU3YTgwNDBkYjZiNzgxNWM0YzAyNDg0NWEzMzJlNGZkNmImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.6Lj9zZkHW4j1mbNQGfYcTkY4ZpVYYmW7nr_vNigsRYo)
压缩包里面有公私钥和证书,我使用证书解析网址解析出来看到OID使用的是1.2.840.10045.2.1
,parameters是1.2.156.10197.1.301
,导致我们在前端使用js解密有问题,所以想请教下。😂
from hutool.
@cxhello Java生成的密钥确实不是Asni格式,是pkcs8和x509。
现在Hutool只能保证js生成的密钥可以用,但是Java生成的密钥没法在js中使用。
from hutool.
好的,我自己再研究下。
from hutool.
@cxhello
看下这个cxhello
你的意思是想直接在两方用ans.1编码的吗
您的问题是一个历史遗留问题
您解析证书时看到的OID 1.2.840.10045.2.1(是因为该证书使用了OpenSSL 1.x版本的实现。在OpenSSL 1.x版本中,SM2算法的公钥被错误地标识为标准的EC公钥(OID: 1.2.840.10045.2.1),而不是国密标准中定义的SM2算法的OID(1.2.156.10197.1.301)sm2p256v1。这导致了与国密标准的不一致。
建议您使用OpenSSL 3.x版本。OpenSSL 3.x版本中,SM2公钥密码算法已经使用了正确的OID 1.2.156.10197.1.301(参见《GB/T 33560-2017 信息安全技术 密码应用标识规范》附录A)。虽然这一更改可能导致一些后向兼容性问题,但这是为了遵循最新的国密标准,并解决之前版本存在的标准落后于实践的问题。
- openssl/openssl#22184
- openssl/openssl#22529
- openssl/openssl#20973
- openssl/openssl#11328
- Tongsuo-Project/Tongsuo#477
- emmansun/gmsm#197
#http://gmssl.org/docs/oid.html
from hutool.
您解析证书时看到的OID 1.2.840.10045.2.1(是因为该证书使用了OpenSSL 1.x版本的实现。在OpenSSL 1.x版本中,SM2算法的公钥被错误地标识为标准的EC公钥(OID: 1.2.840.10045.2.1),而不是国密标准中定义的SM2算法的OID(1.2.156.10197.1.301)sm2p256v1。这导致了与国密标准的不一致。
@CherryRum 其实我想表达的是 我使用的hutool-5.7.22版本,生成的公私钥OID也是:1.2.840.10045.2.1,是需要更新版本吗?😂
from hutool.
那我建议您先升级版本吧,这个虽然不错,但是不符合现有的文档定义的曲线,虽然说这俩oid的椭圆曲线是一样的(没记错的话)
from hutool.
@CherryRum 我们需要给客户演示的时候在他们的环境使用openss命令生成,所以如果客户的环境上使用openssl 1.x 其实没什么问题。我刚刚测试了,可以正常加解密了。
![image](https://private-user-images.githubusercontent.com/49056040/345405541-ffa720bc-5510-4aeb-a266-5f7e892604a8.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYwNTUyNjQsIm5iZiI6MTcyNjA1NDk2NCwicGF0aCI6Ii80OTA1NjA0MC8zNDU0MDU1NDEtZmZhNzIwYmMtNTUxMC00YWViLWEyNjYtNWY3ZTg5MjYwNGE4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTExVDExNDI0NFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTc5ZGFhYmRiYzQwYmJkOGI3MmQ2MjNhZjY5ODRjNDAwNGIxMWE5OWY5ZTQ4YWI4ZGYwYmRmNTRlZjczMTlmYzYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0._AvaP0NoQtlAEW7_0XjbAewxohkUZtlBFiQyZyS1-4c)
感谢大佬说的这个历史遗留问题。还有个问题想问下,hutool升级到5.8.29 OID就是1.2.156.10197.1.301了吗?
我是在我电脑上使用openssl生成公私钥发现这个问题的,我电脑上openssl版本是3.2.0。所以前端在使用私钥解密的时候报错了,前端用的应该也恰好是以前的库。😂
![image](https://private-user-images.githubusercontent.com/49056040/345405254-1556f1ba-52a6-4d89-9620-5efd6ea74e2f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYwNTUyNjQsIm5iZiI6MTcyNjA1NDk2NCwicGF0aCI6Ii80OTA1NjA0MC8zNDU0MDUyNTQtMTU1NmYxYmEtNTJhNi00ZDg5LTk2MjAtNWVmZDZlYTc0ZTJmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTExVDExNDI0NFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThkNzcwNzJlZDBhNTc5MDYxZDI4NmYwYTc5M2ZmZWRkNDJiZjdiOTliMTNkMTY1NmM0YTQ2Y2UyYTAwODEzMjcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.AhQqlKkHTmOmyVclMdC1GyBtp8CYGLxlgK7AgdXKNfA)
from hutool.
确实没注意,我想新版本要做下更新了。
from hutool.
这其实是个算法的归类问题,取决于 SM2 是应该属于 EC 算法的一条曲线,还是应该与 EC 并列的算法。
我觉得业界一直是认为 SM2 就是一条特殊的 EC 曲线,所以一开始大家都是按照 EC 的标准去走的,包括 《GM/T 0015-2012 基于SM2密码算法的数字证书格式规范》 在附录中给出的示例,也是使用 1.2.840.10045.2.1
作为算法 Oid 的。
![image](https://private-user-images.githubusercontent.com/8073367/348216441-8426ebb6-3d78-4e41-8f45-2ce0a65e24a8.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYwNTUyNjQsIm5iZiI6MTcyNjA1NDk2NCwicGF0aCI6Ii84MDczMzY3LzM0ODIxNjQ0MS04NDI2ZWJiNi0zZDc4LTRlNDEtOGY0NS0yY2UwYTY1ZTI0YTgucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDkxMSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA5MTFUMTE0MjQ0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZDUzMzEzNDM4NTBjN2JlNTUwNDcwY2JjNGM2Zjc2N2Q0OGNjNzc3MzIxZWM5MDAxNDI5ZDRhYjRhODUxYjVmOSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.zmSwmyoOB0hsx5uZsKShxCoGERJjW3LGdoLXpmF1EWg)
OpenSSL 团队在升级 3.0 时,也解释了他们最初这样做的原因,他们团队内部当时认为应该将 SM2 算法视为一种独立的算法,所以他们参考了《GM/T 0006-2012 密码应用标识规范》给出的 Oid 来标识 SM2 算法。
![image](https://private-user-images.githubusercontent.com/8073367/348217747-7713425d-0ee8-4030-88dd-9d3b71ed7144.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYwNTUyNjQsIm5iZiI6MTcyNjA1NDk2NCwicGF0aCI6Ii84MDczMzY3LzM0ODIxNzc0Ny03NzEzNDI1ZC0wZWU4LTQwMzAtODhkZC05ZDNiNzFlZDcxNDQucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDkxMSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA5MTFUMTE0MjQ0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YTMwYmQ1YTM1NTUzNzEwMGY1NDM2OWY2NjY0N2IzYmEzZWEzZDBhY2YyODkxMThmNTc1Zjk4ZDk5NWQwNmYzZiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.F9EVjD0HnABADsWnTf2jEy-VTOyeQs6arA1stYcQR2k)
这造成了很大的混乱,我觉得既然 GM/T 0015
已经给出了明确的参考示例,那么正如 OpenSSL 开发人员在 Issue 中说的:『如果有一个标准规定应该以特定的方式进行编码,那么我们就不能以不同的方式进行编码』。
PS: 不过我觉得这个事情大概率还是 0015 制定者的锅,因为在 GM/T 0015
标准的附录表格中是这样描述的:
![image](https://private-user-images.githubusercontent.com/8073367/348218071-ea433bad-9f82-4164-a9f9-11420647ce62.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYwNTUyNjQsIm5iZiI6MTcyNjA1NDk2NCwicGF0aCI6Ii84MDczMzY3LzM0ODIxODA3MS1lYTQzM2JhZC05ZjgyLTQxNjQtYTlmOS0xMTQyMDY0N2NlNjIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDkxMSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA5MTFUMTE0MjQ0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NDJkOGVmZjA4NTk0ZTZhYTE0MzQ4NmJjOWE2YmM0NmFmZjA2NTE4ZjhiMTUyNGFkMzdiNjI1MTU1ZTQ4ODJiMSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.tWcGl0P0Pby-qrLNWvSWGAXd7p0BhM6zCIvz0c2DSYc)
可以明确看到 algorithm
部分给的值是 1.2.156.10197.1.301
,parameters
部分标记的是:『当使用 SM2 密码算法时,为 SM2 密码算法曲线的 OID』。
但是到下面附录的示例又变成了上面贴图的那样,大家实现的时候即使有疑问,也肯定会优先去符合标准示例。
这特么找谁说理去。
再提一嘴,目前所有的国密基础设施都是按照示例走的,所以在实际编码中,使用 1.2.840.10045.2.1
才是正解,会避免 N 多兼容性问题。
from hutool.
我公司 arm kylin v10 的服务器上 openssl 版本是 1.1.1f,生成的国密公私钥OID就是1.2.156.10197.1.301
,可是坑了我一把。😂
from hutool.
@changhr2013
我公司 arm kylin v10 的服务器上 openssl 版本是 1.1.1f,生成的国密公私钥OID就是1.2.156.10197.1.301
,可是坑了我一把。😂这个算是个bug,升级到openssl最新版本就能解决。 相关issue在这里,有过不少讨论 openssl/openssl#20973
也不算是bug吧,上面我引用了很多,其中就有这个,只是标准太模糊了
from hutool.
新的参考:https://www.cnblogs.com/yang37/p/16636435.html
from hutool.
Related Issues (20)
- DateUtil.parse 时间戳格式化报错 HOT 2
- 5.8.29版本使用ExcelUtil分页多次写入同一个sheet时,标题行重复写入 HOT 1
- No such algorithm: SM4 HOT 7
- DateUtil.parse 或者 DateUtil.parseUTC 方式处理带毫秒结果不对 HOT 1
- jdk版本不一样,tobean结果不同,jdk11正常,jdk21解析异常 HOT 1
- org.dromara.hutool.core.reflect.FieldUtil#getDeclearField 方法名拼写错误 HOT 1
- Sonar扫描强迫症患者:"static" base class members should not be accessed via derived types HOT 2
- FileUtil.mkdir() 提示 java.lang.NoClassDefFoundError: java/sql/SQLException HOT 1
- 权重随机类实现方式问题 HOT 4
- httprequest, 希望可以控制content-type 是否传入 HOT 1
- Http发送POST重定向时,没有使用GET导致报错 HOT 6
- 请教下怎么重写响应体? HOT 3
- 请教如何根据条件改变单元格格式? HOT 1
- FileUtil.createTempFile设置isReCreat为true HOT 1
- Assert.notEmpty java.lang.NoSuchMethodError: cn.hutool.core.lang.Assert.notEmpty HOT 4
- xls 文件解析异常 HOT 3
- hutool sm2生成的密钥与sm-crypto生成的密钥不一致,无法相互使用 HOT 1
- CglibUtil.copy 的 converter 参数无法使用 HOT 1
- hutool get/post 报错 HOT 4
- 在java 8 下面用hutool 5.8.29版本发送post请求调用google map的validateAddress api时发现返回404 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from hutool.