20231427田泽航实验4-1

20231427田泽航_实验4

部署运行你感兴趣的模型镜像一键部署
密码模块的应用
实践要求(40分)
****1 .完成电子公文交换系统,系统功能,(15分)

mindmap
root((电子公文系统))
发文
公文起草
公文查看
发文审核(审核员)
公文发送
公文查询
收文
公文签收
公文查看
公文处理
公文查询
系统管理
组织单位
用户管理
操作员(科员)
审核员(科⻓,处⻓):至少有一级审核功能
系统管理员:至少管理用户账号,组织单位功能
安全保密管理员:至少有权限管理功能,密钥管理功能
安全审计员:至少有日志查看功能
权限设置(安全保密管理员)
系统日志
数据字典(选做)

image

总体要求
项目类型必须是B/S或C/S架构
项目程序设计语言可以是C,Python,Rust等
三员制度是指将系统管理员、安全保密管理员和安全审计员三个⻆色分离,分别负责系统运行、安全保密和安全管理,相互制约,共同保障信息系统安全。三员职责
系统管理员
负责信息系统的日常维护、故障处理和升级更新。
确保系统正常运行,对系统资源进行合理分配。
负责用户账号的创建、修改和删除。
定期备份重要数据,确保数据安全。

安全保密管理员
负责制定和实施安全保密策略,确保信息系统安全。
对用户进行安全意识培训,提高用户安全防范能力。
监控网络安全状况,发现异常情况及时处理。
负责信息系统安全事件的应急响应和处理。

安全审计员
负责对信息系统进行安全审计,评估安全⻛险。
监督系统管理员和安全保密管理员的工作,确保其履行职责。
对信息系统安全事件进行调查,提出整改建议。
3. ⻩金法则(5分)
身份鉴别:口令不能存,数据库要保存加盐的SM3Hash值
访问控制:操作员,审核员,安全三员的权限设置
安全审计:至少完成日志查询功能
4. 密码(15分)
算法:SM2,SM3,SM4,推荐使用 Key
密钥管理:所有私钥,对称算法密钥等不能明存
5. 系统量化评估(5分)
按照商用密码应用安全性评估量化评估规则,计算自己系统的得分,只计算应用和数据安全

****二、系统测试及实现过程
操作规程
运行代码
该项目是在python中Django环境下实现的,首先运行代码需要在终端下实行以下操作:

C:\Users\dell\AppData\Local\Programs\Python\Python311\python.exe C:\Users\dell\Desktop\docsys-master\完整项目\doc-trans-sys\system-master\manage.py

Type 'manage.py help ' for help on a specific subcommand.

Available subcommands:

[auth]
changepassword
createsuperuser

[contenttypes]
remove_stale_contenttypes

[django]
check
compilemessages
createcachetable
dbshell
diffsettings
dumpdata
flush
inspectdb
loaddata
makemessages
makemigrations
migrate
optimizemigration
sendtestemail
shell
showmigrations
sqlflush
sqlmigrate
sqlsequencereset
squashmigrations
startapp
startproject
test
testserver

[django_extensions]
admin_generator
clean_pyc
clear_cache
compile_pyc
create_command
create_jobs
create_template_tags
delete_squashed_migrations
describe_form
drop_test_database
dumpscript
export_emails
find_template
generate_password
generate_secret_key
graph_models
list_model_info
list_signals
mail_debug
managestate
merge_model_instances
notes
pipchecker
print_settings
print_user_for_session
raise_test_exception
reset_db
reset_schema
runjob
runjobs
runprofileserver
runscript
runserver_plus
set_default_site
set_fake_emails
set_fake_passwords
shell_plus
show_template_tags
show_urls
sqlcreate
sqldiff
sqldsn
sync_s3
syncdata
unreferenced_files
update_permissions
validate_templates

[sessions]
clearsessions

[sslserver]
runsslserver

[staticfiles]
collectstatic
findstatic
runserver

进程已结束,退出代码0

配置mysql
参考链接教程:
2024 年 MySQL 8.0 安装 配置 教程 最简易(保姆级)
注意要在代码文件的“settings.py”中对配置的sql数据库信息进行更改

配置虚拟环境

安装 virtualenv

pip install virtualenv
AI写代码
1
然后,创建虚拟环境:

virtualenv venv
AI写代码
1
激活虚拟环境

.\venv\Scripts\activate.bat
AI写代码
1
然后就进入了虚拟环境中

  1. 进行应用迁移
    在虚拟环境中运行:

python manage.py migrate
AI写代码
1
启动开发服务器
准备工作完成,即可启动Django 开发服务器:
python manage.py runserver 7788
AI写代码
1
(7788为自定义端口号)

启动成功,可以运行http://127.0.0.1:7788/网址了

部分重要代码
实现加密过程的代码

-- coding: UTF-8 --

! /usr/bin/env python

import base64
from Crypto.Cipher import PKCS1_v1_5 as PKCS1_v1_5_cipper
from Crypto.Signature import PKCS1_v1_5
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA
import rsa
from Cryptodome import Random
from Cryptodome.PublicKey import RSA
from Cryptodome.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
from Cryptodome.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5
import Crypto

使用 rsa库进行RSA签名和加解密

伪随机数生成器

random_generator = Random.new().read

with open('random.txt', 'w') as f:

f.write(str(random_generator))

# rsa算法生成实例

rsa = RSA.generate(1024, random_generator)

private_pem = str(rsa.exportKey(), encoding="utf-8")

with open("client-private.pem", "w") as f:

f.write(private_pem)

public_pem = str(rsa.publickey().exportKey(), encoding="utf-8")

with open("client-public.pem", "w") as f:

f.write(public_pem)

class RsaUtil(object):
PUBLIC_KEY_PATH = 'client-public.pem' # 公钥
PRIVATE_KEY_PATH = 'client-private.pem' # 私钥

# 初始化key
def __init__(self,
             company_pub_file=PUBLIC_KEY_PATH,
             company_pri_file=PRIVATE_KEY_PATH):

    if company_pub_file:
        self.company_public_key = RSA.importKey(open(company_pub_file).read())
    if company_pri_file:
        self.company_private_key = RSA.importKey(open(company_pri_file).read())

def get_max_length(self, rsa_key, encrypt=True):
    """加密内容过长时 需要分段加密 换算每一段的长度.
        :param rsa_key: 钥匙.
        :param encrypt: 是否是加密.
    """
    blocksize = Crypto.Util.number.size(rsa_key.n) / 8
    reserve_size = 11  # 预留位为11
    if not encrypt:  # 解密时不需要考虑预留位
        reserve_size = 0
    maxlength = blocksize - reserve_size
    return maxlength

# 加密 支付方公钥
def encrypt_by_public_key(self, encrypt_message):
    """使用公钥加密.
        :param encrypt_message: 需要加密的内容.
        加密之后需要对接过进行base64转码
    """
    encrypt_result = b''
    max_length = int(self.get_max_length(self.company_public_key))
    cipher = PKCS1_v1_5_cipper.new(self.company_public_key)
    while encrypt_message:
        input_data = encrypt_message[:max_length]
        encrypt_message = encrypt_message[max_length:]
        out_data = cipher.encrypt(input_data)
        encrypt_result += out_data
    encrypt_result = base64.b64encode(encrypt_result)
    return encrypt_result

# 加密 支付方私钥
def encrypt_by_private_key(self, encrypt_message):
    """使用私钥加密.
        :param encrypt_message: 需要加密的内容.
        加密之后需要对接过进行base64转码
    """
    encrypt_result = b""
    max_length = int(self.get_max_length(self.company_private_key))
    cipher = PKCS1_v1_5_cipper.new(self.company_public_key)
    while encrypt_message:
        input_data = encrypt_message[:max_length]
        encrypt_message = encrypt_message[max_length:]
        out_data = cipher.encrypt(input_data.encode(encoding='utf-8').strip() + b"\n")
        encrypt_result += out_data
    encrypt_result = base64.b64encode(encrypt_result)
    return encrypt_result

def decrypt_by_public_key(self, decrypt_message):
    """使用公钥解密.
        :param decrypt_message: 需要解密的内容.
        解密之后的内容直接是字符串,不需要在进行转义
    """
    decrypt_result = b""
    max_length = self.get_max_length(self.company_public_key, False)
    decrypt_message = base64.b64decode(decrypt_message)
    cipher = PKCS1_v1_5_cipper.new(self.company_public_key)
    while decrypt_message:
        input_data = decrypt_message[:max_length]
        decrypt_message = decrypt_message[max_length:]
        out_data = cipher.decrypt(input_data.encode(encoding='utf-8'), '')
        decrypt_result += out_data
    return decrypt_result

def decrypt_by_private_key(self, decrypt_message):
    """使用私钥解密.
        :param decrypt_message: 需要解密的内容.
        解密之后的内容直接是字符串,不需要在进行转义
    """
    decrypt_result = b""
    max_length = int(self.get_max_length(self.company_private_key, False))
    decrypt_message = base64.b64decode(decrypt_message)
    cipher = PKCS1_v1_5_cipper.new(self.company_private_key)
    while decrypt_message:
        input_data = decrypt_message[:max_length]
        decrypt_message = decrypt_message[max_length:]
        out_data = cipher.decrypt(input_data, '')
        decrypt_result += out_data.strip() + b"\n"
        #decrypt_result += str(out_data).encode(encoding='utf-8').strip() + b"\n"
    return decrypt_result

# 签名 商户私钥 base64转码
def sign_by_private_key(self, message):
    """私钥签名.
        :param message: 需要签名的内容.
        签名之后,需要转义后输出
    """
    cipher = PKCS1_v1_5.new(self.company_private_key)  # 用公钥签名,会报错 raise TypeError("No private key") 如下
    # if not self.has_private():
    #   raise TypeError("No private key")
    hs = SHA.new(message)
    signature = cipher.sign(hs)
    return base64.b64encode(signature)

def verify_by_public_key(self, message, signature):
    """公钥验签.
        :param message: 验签的内容.
        :param signature: 对验签内容签名的值(签名之后,会进行b64encode转码,所以验签前也需转码).
    """
    signature = base64.b64decode(signature)
    cipher = PKCS1_v1_5.new(self.company_public_key)
    hs = SHA.new(message)

    # digest = hashlib.sha1(message).digest()  # 内容摘要的生成方法有很多种,只要签名和解签用的是一样的就可以

    return cipher.verify(hs, signature)

with open(r'C:\Users\misaka\Desktop\1.docx', 'rb') as f:
message = f.read()
rsaUtil = RsaUtil()
encrypy_result = rsaUtil.encrypt_by_public_key(message)
with open(r'C:\Users\misaka\Desktop\cryed.docx',"wb") as w:
w.write(encrypy_result)

这段代码用于使用RSA算法对文件内容进行加密。

导入库:代码开始部分导入了必要的库,包括base64用于编码,Crypto及其子模块用于加密操作。

RsaUtil类:定义了一个名为RsaUtil的类,用于封装RSA加密、解密、签名和验证的方法。

初始化密钥:__init__方法用于从文件中加载公钥和私钥。

计算最大长度:get_max_length方法用于计算在加密时每段数据的最大长度,以适应RSA加密块的大小。

加密方法:

encrypt_by_public_key:使用公钥加密消息。
encrypt_by_private_key:使用私钥加密消息(虽然这个功能不常用,因为通常使用公钥进行加密)。
签名和验证:

sign_by_private_key:使用私钥对消息进行签名。
verify_by_public_key:使用公钥验证签名。
文件加密:

代码读取指定路径下的文件(C:\Users\misaka\Desktop\1.docx)。
创建RsaUtil类的实例。
使用公钥对文件内容进行加密。
将加密后的内容写入新文件(C:\Users\misaka\Desktop\cryed.docx)。
实现解密过程的代码

-- coding: UTF-8 --

! /usr/bin/env python

import base64
from Crypto.Cipher import PKCS1_v1_5 as PKCS1_v1_5_cipper
from Crypto.Signature import PKCS1_v1_5
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA
import rsa
from Cryptodome import Random
from Cryptodome.PublicKey import RSA
from Cryptodome.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
from Cryptodome.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5
import Crypto

'''

使用 rsa库进行RSA签名和加解密

伪随机数生成器

random_generator = Random.new().read
with open('random.txt', 'w') as f:
f.write(str(random_generator))

rsa算法生成实例

rsa = RSA.generate(1024, random_generator)
private_pem = str(rsa.exportKey(), encoding="utf-8")
with open("client-private.pem", "w") as f:
f.write(private_pem)

public_pem = str(rsa.publickey().exportKey(), encoding="utf-8")
with open("client-public.pem", "w") as f:
f.write(public_pem)
'''
class RsaUtil(object):
PUBLIC_KEY_PATH = 'client-public.pem' # 公钥
PRIVATE_KEY_PATH = 'client-private.pem' # 私钥

# 初始化key
def __init__(self,
             company_pub_file=PUBLIC_KEY_PATH,
             company_pri_file=PRIVATE_KEY_PATH):

    if company_pub_file:
        self.company_public_key = RSA.importKey(open(company_pub_file).read())
    if company_pri_file:
        self.company_private_key = RSA.importKey(open(company_pri_file).read())

def get_max_length(self, rsa_key, encrypt=True):
    """加密内容过长时 需要分段加密 换算每一段的长度.
        :param rsa_key: 钥匙.
        :param encrypt: 是否是加密.
    """
    blocksize = Crypto.Util.number.size(rsa_key.n) / 8
    reserve_size = 11  # 预留位为11
    if not encrypt:  # 解密时不需要考虑预留位
        reserve_size = 0
    maxlength = blocksize - reserve_size
    return maxlength

# 加密 支付方公钥
def encrypt_by_public_key(self, encrypt_message):
    """使用公钥加密.
        :param encrypt_message: 需要加密的内容.
        加密之后需要对接过进行base64转码
    """
    encrypt_result = b''
    max_length = int(self.get_max_length(self.company_public_key))
    cipher = PKCS1_v1_5_cipper.new(self.company_public_key)
    while encrypt_message:
        input_data = encrypt_message[:max_length]
        encrypt_message = encrypt_message[max_length:]
        out_data = cipher.encrypt(input_data)
        encrypt_result += out_data
    encrypt_result = base64.b64encode(encrypt_result)
    return encrypt_result

# 加密 支付方私钥
def encrypt_by_private_key(self, encrypt_message):
    """使用私钥加密.
        :param encrypt_message: 需要加密的内容.
        加密之后需要对接过进行base64转码
    """
    encrypt_result = b""
    max_length = int(self.get_max_length(self.company_private_key))
    cipher = PKCS1_v1_5_cipper.new(self.company_public_key)
    while encrypt_message:
        input_data = encrypt_message[:max_length]
        encrypt_message = encrypt_message[max_length:]
        out_data = cipher.encrypt(input_data.encode(encoding='utf-8').strip() + b"\n")
        encrypt_result += out_data
    encrypt_result = base64.b64encode(encrypt_result)
    return encrypt_result

def decrypt_by_public_key(self, decrypt_message):
    """使用公钥解密.
        :param decrypt_message: 需要解密的内容.
        解密之后的内容直接是字符串,不需要在进行转义
    """
    decrypt_result = b""
    max_length = self.get_max_length(self.company_public_key, False)
    decrypt_message = base64.b64decode(decrypt_message)
    cipher = PKCS1_v1_5_cipper.new(self.company_public_key)
    while decrypt_message:
        input_data = decrypt_message[:max_length]
        decrypt_message = decrypt_message[max_length:]
        out_data = cipher.decrypt(input_data.encode(encoding='utf-8'), '')
        decrypt_result += out_data
    return decrypt_result

def decrypt_by_private_key(self, decrypt_message):
    """使用私钥解密.
        :param decrypt_message: 需要解密的内容.
        解密之后的内容直接是字符串,不需要在进行转义
    """
    decrypt_result = b""
    max_length = int(self.get_max_length(self.company_private_key, False))
    decrypt_message = base64.b64decode(decrypt_message)
    cipher = PKCS1_v1_5_cipper.new(self.company_private_key)
    while decrypt_message:
        input_data = decrypt_message[:max_length]
        decrypt_message = decrypt_message[max_length:]
        out_data = cipher.decrypt(input_data, '')
        decrypt_result += out_data.strip() + b"\n"
        #decrypt_result += str(out_data).encode(encoding='utf-8').strip() + b"\n"
    return decrypt_result

# 签名 商户私钥 base64转码
def sign_by_private_key(self, message):
    """私钥签名.
        :param message: 需要签名的内容.
        签名之后,需要转义后输出
    """
    cipher = PKCS1_v1_5.new(self.company_private_key)  # 用公钥签名,会报错 raise TypeError("No private key") 如下
    # if not self.has_private():
    #   raise TypeError("No private key")
    hs = SHA.new(message)
    signature = cipher.sign(hs)
    return base64.b64encode(signature)

def verify_by_public_key(self, message, signature):
    """公钥验签.
        :param message: 验签的内容.
        :param signature: 对验签内容签名的值(签名之后,会进行b64encode转码,所以验签前也需转码).
    """
    signature = base64.b64decode(signature)
    cipher = PKCS1_v1_5.new(self.company_public_key)
    hs = SHA.new(message)

    # digest = hashlib.sha1(message).digest()  # 内容摘要的生成方法有很多种,只要签名和解签用的是一样的就可以

    return cipher.verify(hs, signature)

rsaUtil = RsaUtil()
'''encrypy_result = rsaUtil.encrypt_by_public_key(message)
with open(r'D:\document\study\RocEDU\dzgw\test4\cryed.txt',"wb") as w:
w.write(encrypy_result)
'''
with open(r'C:\Users\misaka\Desktop\cryed.docx','rb') as r:
encrypy_result = r.read()
decrypt_result = rsaUtil.decrypt_by_private_key(encrypy_result)

code =decrypt_result.decode(errors='ignore').encode('utf-8')
with open(r'C:\Users\misaka\Desktop\decry.docx', "wb") as w:
w.write(code)

with open(r'C:\Users\misaka\Desktop\1.docx', 'rb') as f:
message = f.read()
sign = rsaUtil.sign_by_private_key(bytearray(message))
print("验签结果:>>> ")
print(rsaUtil.verify_by_public_key(bytearray(message), sign))

这段代码用于实现RSA算法的签名和加解密操作。它使用了pycryptodome库,这是pycrypto的一个分支,用于处理加密算法。

导入库:代码开始部分导入了必要的库,包括base64用于编码,Crypto用于加密操作,RSA用于生成和管理RSA密钥对。

RsaUtil类:定义了一个名为RsaUtil的类,用于封装RSA加密和解密、签名和验证的方法。

初始化密钥:__init__方法用于从文件中加载公钥和私钥。

计算最大长度:get_max_length方法用于计算在加密时每段数据的最大长度,以适应RSA加密块的大小。

解密方法:

decrypt_by_public_key:使用公钥解密消息。
decrypt_by_private_key:使用私钥解密消息。
签名和验证:

sign_by_private_key:使用私钥对消息进行签名。
verify_by_public_key:使用公钥验证签名。
文件操作:代码中包含了读取加密文件、解密内容并保存到新文件的操作,以及对文件内容进行签名和验证的操作。

系统运行测试
系统运行代码

!/usr/bin/env python

"""Django's command-line utility for administrative tasks."""
import os
import sys

def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'system.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)

if name == 'main':
main()

系统欢迎界面
测试图片
image

登录页面
测试图片
image

注册页面
测试图片
image

点击“了解我们”或“制作过程”,即可进入云班课中的作业要求
image

公文起草发送
image

发送的公文标题设为test,选择密级(分为普密,机密,绝密)
image

接受公文并查看
image

同时刚发送公文文件的用户20231427tzh也会在“我的文件”中查看到该公文文件”test"
image

日志查看
源代码:

logging_ubits.py
import logging

配置日志级别和日志格式

logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')

创建一个logger对象

logger = logging.getLogger(name)

def view_function(doc_id):
try:
# 记录用户请求的doc_id
logger.info(f"View accessed with doc_id: {doc_id}")

    # 调用模型函数
    result = model_function(doc_id)

    # 记录查询结果
    logger.info(f"View received result: {result}")

    return result
except Exception as e:
    # 记录异常信息
    logger.error(f"Error in view_function: {e}")
    raise

def model_function(doc_id):
try:
# 记录检索文档的doc_id
logger.info(f"Retrieving document with doc_id: {doc_id}")

    # 模拟数据库查询
    # 假设这里是数据库查询代码
    query_result = "query result"

    # 记录查询结果
    logger.debug(f"Query result: {query_result}")

    return query_result
except Exception as e:
    # 记录异常信息
    logger.error(f"Error retrieving document: {e}")
    raise

测试代码

if name == "main":
doc_id = "12345"
result = view_function(doc_id)
print(result)

在modules.py中添加安全审计员进行日志查看

class Role(models.Model):
name = models.CharField(max_length=255)
permissions = models.ManyToManyField('Permission', blank=True)

class Permission(models.Model):
name = models.CharField(max_length=255)
description = models.TextField(blank=True)

管理员模式(修改用户和删除用户)
我们先注册一个测试用户用户名为ceshi
image

进入管理员模式
具有修改用户和删除用户的功能
点击修改用户,即可进行对用户查询并修改密码的功能
image

修改刚刚注册的测试用户密码更改为“12345”
image

点击删除用户,即可进行用户的查询并删除功能
image

文件审核功能
image

对公文的审核具有批准和拒绝的操作
image

最后点击退出,回到主页面
image

三、 系统量化评估
按照商用密码应用安全性评估量化评估规则,计算自己系统的得分,只计算应用和数据安全。
image

身份鉴别:1
访问控制信息完整性:0.5
重要信息资源安全标记完整性:1
重要数据传输机密性:1
重要数据存储机密性:0.7
重要数据传输完整性:0.5
重要数据存储完整性:0.7
不可否认性:1

posted @ 2025-12-14 22:46  田泽航  阅读(3)  评论(0)    收藏  举报