博客字典爆破尝试
起因
碎碎念
这已经是我第二次遇到加密的博客了,有了经验,那就是这玩意是不上传服务器的。
既然是在前端,那怎么确保安全性呢?
翻阅源代码可知,作者也是挺聪明的。
已经知道放在前端的东西会被各种手段操作,但是如果是用的AES-CBC加密,并且密码完全不放在前端,又当如何?
只剩下一条路了
爆破,或者用字典,这其实是同一条路。
摆在面前的是类似于压缩包的东西,那就爆破一下,博文应该不会设置太难的密码。。。。吧?
把代码丢给ai喂一下,让ai把python版本的代码吐出来,顺便加一下多线程什么的。
就变成了下面这样:
点击查看代码
import threading
from Crypto.Cipher import AES
from Crypto.Hash import SHA256
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Util.Padding import unpad
def hex_to_array(s):
data = []
for i in range(0, len(s), 2):
num = int(s[i:i + 2], 16)
data.append(num)
return bytes(data)
def get_hmac_key(key_material, key_salt):
return PBKDF2(key_material, key_salt, dkLen=32, count=1024, hmac_hash_module=SHA256)
def get_iv(key_material, iv_salt):
return PBKDF2(key_material, iv_salt, dkLen=16, count=512, hmac_hash_module=SHA256)
def get_key_material(password):
return password.encode()
known_prefix = "<hbe-prefix></hbe-prefix>"
def decrypt(ciphertext, password):
key_salt = "hexo-blog-encrypt的作者们都是大帅比!".encode()
iv_salt = "hexo-blog-encrypt是地表最强Hexo加密插件!".encode()
try:
key_material = get_key_material(password)
hmac_key = get_hmac_key(key_material, key_salt)
iv = get_iv(key_material, iv_salt)
ciphertext_bytes = hex_to_array(ciphertext)
cipher = AES.new(hmac_key, AES.MODE_CBC, iv)
decrypted_data = cipher.decrypt(ciphertext_bytes)
unpadded_data = unpad(decrypted_data, AES.block_size)
if not unpadded_data.decode().startswith(known_prefix):
return None
except ValueError as e:
return None
return unpadded_data.decode()
def worker(ciphertext, password_chunk, event):
for password in password_chunk:
password = password.strip()
if event.is_set():
return
result = decrypt(ciphertext, password)
if result:
print(f"Decrypted successfully with password: {password.strip()}")
event.set()
return
def brute_force(ciphertext, passwords, max_threads=5):
results = []
threads = []
password_chunks = [[] for _ in range(max_threads)]
for index, password in enumerate(passwords):
chunk_index = index % max_threads
password_chunks[chunk_index].append(password)
stop_event = threading.Event()
for password_chunk in password_chunks:
if password_chunk:
t = threading.Thread(target=lambda chunk=password_chunk: worker(ciphertext, chunk, stop_event))
threads.append(t)
t.start()
for t in threads:
t.join()
if not stop_event.is_set():
print("No valid password found.")
try:
with open('enData.txt', 'r') as f:
ciphertext = f.read().strip()
with open(r"你应该有自己的字典8", 'r', encoding="utf-8") as f:
passwords = f.readlines()
brute_force(ciphertext, passwords, max_threads=200)
except FileNotFoundError as e:
print(f"Error: {e}")
爆破
也许你不相信,但是真的有人会用超长的密码去加密一篇博客,有鬼吧。
我没有加进度条,但是200个进程跑那么久跑不出来已经很说明问题了。
思索与展望
密码应该是随机生成的密码,毕竟是测试博客,不贴链接了避免引攻击过去
如果为了方便阅读和分享,把密码设置得很短,那样的话容易被爆破。
而如果为了能够避免爆破,把密码放在服务器,那样会造成服务器的更大压力(需要解密)
然后如果为了避免爆破随机生成密码,那样密码就会难以交换。
出路
非对称加密!
是的,非对称加密可解这个问题。
点击查看代码
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEZ1EfmBYJKwYBBAHaRw8BAQdA6qG43AJ3pw9sd4PviX9WUYLy0MygwbYYC9WQ
HI/4dP60FlRpbW1vYyA8dGltbW9jQHFxLmNvbT6IkwQTFgoAOxYhBAkeITdBrQIt
QWhQ9JJWfviGvwwPBQJnUR+YAhsDBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheA
AAoJEJJWfviGvwwPR3wBANk6S/71wZYI6J/if8WHaJmADmGJMi0Vfjn7aXSjCTe/
AQDdVJZbJidKNCszkyYLm+G5rL2impN9sRrHRHAd0IsHCLg4BGdRH5gSCisGAQQB
l1UBBQEBB0CXa82EutF3trEi8Tcu62LmZeNIO/uy4K55Mjh5s1PZYgMBCAeIeAQY
FgoAIBYhBAkeITdBrQItQWhQ9JJWfviGvwwPBQJnUR+YAhsMAAoJEJJWfviGvwwP
00YA/RU8UDp5KDvf5E1kSRbTIMLEFLlKYIqyQcOHQpu0dYkdAQDBZTcsZcNIjxJ9
C2hq+ebK4sQH9/tvnLLkyX4S/84WBw==
=UuMz
-----END PGP PUBLIC KEY BLOCK-----
我实在不想对这个糟心的东西发表任何意见,都5.0了居然还不支持中文。
另外还有手机版的KeyChain无法解密电脑版加密的数据,翻遍了网上的资料,发现是因为电脑版有新特性手机版不更新导致的。
社区混乱不堪也。
这也是,pgp毕竟是老古董了,但现在的开源软件基本还是会有一个sig。
因为它古老,也因为它古老。
全新的非对称加密
形势不容乐观,如果想要开发一个新的软件进行非对称加密,不开源,肯定会被怀疑有病毒;开源吧,第二天各种魔改版又出来了。
我又有多少精力去维护一个开源软件呢?
如果有这样一个非对称加密,在电脑上运行,浏览器询问电脑上是否存在公钥,如果存在,则提交加密数据,电脑解密,返回浏览器,浏览器显示文章。
但是这样的文章(加密的)写出来给谁看呢?不过是炫技罢了。
碎碎念就到这里吧