当前位置:   article > 正文

「渗透笔记」Python中实现国密SM2加密_python sm2

python sm2

一、前言

在数字世界的探索旅程中,我们经常会遇到各种技术挑战和安全问题。作为一名热爱技术的实践者,我一直在寻找那些能够提升我们工作效率和安全性的“奇技淫巧”。

在这个过程中,我发现,很多宝贵的知识和经验往往散落在网络的各个角落,等待着我们去发现和整理。

这次,我想和大家分享的,是我在前端JS中使用SM2加密处理密码的一次实践。这不仅是一个技术实验,更是一次对网络安全世界的深入探索。

通过这个案例,我希望能够为同行们提供一些新的视角和思路,无论是在渗透测试还是安全防护方面。

在这篇文章中,我将详细记录下我是如何一步步分析和破解这个加密过程的。从最初的困惑和无从下手,到最终找到解决方案的喜悦,这个过程充满了挑战,也充满了乐趣。

我相信,通过这次分享,我们不仅能够学习到SM2加密的技术细节,还能够体会到在技术探索中不断进步的快乐。

所以,如果你也对前端安全、密码学或是渗透测试感兴趣,那就请跟随我的步伐,一起走进这个充满技术魅力的世界吧!

在这里插入图片描述

二、本次渗透案例

前一段时间,出去参加某个活动,偶然遇到一个感兴趣的站点,我开始了常规的信息收集:域名WHOIS查询、子域名枚举、端口扫描,甚至还尝试了一些常见的漏洞利用,但结果却让我有些失望——这个站点就像是一个没有破绽的数字堡垒,坚不可摧。。

在这里插入图片描述

就在我准备放弃的时候,我注意到了它的登录入口。我心想,这或许是我唯一能够突破的地方。我迅速在我的“柜子”里面翻出了各种字典,准备对登录接口发起一次暴力破解。然而,当我开始捕获登录请求时,一个意想不到的情况发生了。

我输入了一个简单的密码“123456”,但传输到服务器的竟然不是这串数字,而是一段长得离谱、充满了各种字符的字符串。我愣住了,这是什么魔法?。

在这里插入图片描述

形如:

0439f4fbc41f315bcfd624662fc2cd2cb46883c61dc947bc9
a4ee2fe113efca452db2b066d01d6933bd84fc4a15d768323
eb849a17fdf7fd669223afca1239497748f68454e9f6ce1fb
bc6c91d87b356cb35c2bd66ebda8bb368d90312354ca70ca7
fa47
  • 1
  • 2
  • 3
  • 4
  • 5

然后开始分析登录接口,顺着混淆的稀里哗啦的JS,一点一点往回捋顺,发现它使用了 SM2。

在这里插入图片描述
然后我就接着瞪大眼睛,找相关内容,最后成功找到了它的公钥。

遗憾的是,有很多截图我在过程中并没有去截取,后来报告了相关问题后,这个系统就被关闭了,我现在写文章,想分享怎么一步一步分析的,也没办法提供图片了。
在这里插入图片描述

三、利用Python实现过程

在揭开了SM2加密的神秘面纱后,我决定是时候让Python这个多才多艺的小伙伴出马了。就像一位魔术师准备展示他的招牌魔术一样,我开始在键盘上敲打出一段段神奇的代码,准备让这个加密算法的秘密无处遁形。

1、准备SM2加密算法库

首先,我需要一把锋利的剑——一个可靠的SM2加密库。在网络的海洋中寻寻觅觅,我终于找到了一个由清华大学开发的宝藏:gmssl库。这个库就像是一把锋利无比的瑞士军刀,不仅功能全面,而且性能卓越。

2、开始敲加密代码

① 引入库

import base64  
from gmssl import sm2, func 
  • 1
  • 2

② 构建加密过程

# 公钥和私钥应该是16进制的字符串  
public_key_hex = '04ac0c6afcbf31f******************************'  
private_key_hex = ''  # 替换为实际的私钥16进制字符串,本文的过程不涉及私钥,主要你也搞不到人家的私钥
  • 1
  • 2
  • 3

因为我们的需求只是模拟本地JS对参数进行SM2加密,从而把我们想要传出去的参数正确的传递出去,所以我们压根也不用操心私钥的问题,我们只要加密,不需要解密。

# 初始化SM2加密对象  
sm2_crypt = sm2.CryptSM2(public_key=public_key_hex, private_key=private_key_hex, mode=0) 

# 这里所涉及的mode怎么回事,你可以看看官网文档,如果看不懂,私信我也行
 
  • 1
  • 2
  • 3
  • 4
  • 5
# 将文本数据编码为UTF-8格式的字节串  
data = password.strip().replace('\n','').encode('utf-8')  
                  
# 加密数据  
enc_data = sm2_crypt.encrypt(data)  
                  
# 将加密后的数据转换为十六进制字符串  
hex_enc_data = enc_data.hex() 
                
# 更新POST数据中的用户名和密码
post_data['Password'] = '04'+hex_enc_data
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

为什么加04的话:

在SM2加密的世界里,公钥有两种表现形式:压缩和未压缩。而04前缀就像是一张名片,告诉别人这是一个未压缩的公钥。

它的作用就是用来区分那些看起来有点“胖”的公钥和那些“瘦身成功”的压缩公钥。

四、附录部分

一些有用或无用的玩意儿,提供在这里,希望能帮到你。

gmssl库官网:点击访问gmssl库,你可以找到我们演出中使用的SM2算法的秘密武器。
Python文档:点击访问Python文档,这里是学习Python的宝库,无论你是初学者还是老手,都能在这里找到宝贵的知识。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/448909
推荐阅读
相关标签
  

闽ICP备14008679号