实验验收2
一、保护的资产有哪些?
- 公文
利用sm4加密公文:
key = get_or_generate_key(file_address) ##sm4密钥
encrypt_and_hash_file(file_path, key, file_address)
- 密码
利用加盐哈希保存密码:
def sm3_hash_data(data):
return sm3_hash(func.bytes_to_list(bytes(data, encoding='utf-8')))
获取存储的盐值
salt = user_profile.salt
# 计算带盐的SM3哈希值
salted_hash_password_in = sm3_hash_with_salt(password_in, salt)
print(salted_hash_password_in)
- 密钥
在本系统中,首先使用sm4加密公文,然后利用sm2公钥加密sm4密钥,再利用sm3哈希后取前16个字符作为SM4密钥加密sm2私钥。
def create_user(request):
current_user = request.session['username']
if request.method == 'POST':
form = UserForm(request.POST)
if form.is_valid():
# 获取表单数据并保存到数据库
id = form.cleaned_data['id']
username = form.cleaned_data['username_up']
email = form.cleaned_data['email']
password = form.cleaned_data['password_up']
# 生成随机盐值
salt = generate_random_string(15)
# 计算带盐的SM3哈希值
salted_hash_password = sm3_hash_with_salt(password, salt)
print(salted_hash_password)
# 对加盐哈希值进行SM3运算
sm3_hashed_password = sm3_hash_data(salted_hash_password)
# 取前16个字符作为SM4密钥
sm4_key = sm3_hashed_password[:16]
priKey = PrivateKey()
pubKey = priKey.publicKey()
# 使用SM4加密私钥
encrypted_private_key = sm4_encrypt(sm4_key, priKey.toString())
# 保存到数据库中
UserProfile.objects.create(
id=id,
username_up=username,
email=email,
password_up=salted_hash_password, # 存储带盐的SM3哈希值
salt=salt, # 存储盐值
public_key=pubKey.toString(compressed=False), # 存储公钥
private_key=encrypted_private_key, # 存储私钥
avatar='avatars/default_avatar.png'
)
LogData = Log.objects.create(
username=current_user,
documentname="无",
operation=f'用户{current_user}于{timezone.now()}创建了新用户{username}。'
)
LogData.save()
# 重定向到 index 页面,使用 HttpResponseRedirect 对象
return HttpResponseRedirect(reverse('index'))
else:
form = UserForm()
return render(request, 'adduser.html', {'form': form})
二、数据库表单
用户表单
文件表单
登录表单