可验证算法在招投标领域的专家“盲抽”中的标段识别码加密应用研究

摘要

在招投标过程中,标段(包)识别码的安全性至关重要。本文提出了一种基于可验证算法的标段识别码加密方法,以确保其在专家“盲抽”过程中的保密性和可信性。通过对不同表的标段识别码进行全量加密,并通过匹配验证其一致性,有效防范数据库层级的泄密和内鬼行为。本文详细描述了该算法的设计与实现,并探讨了其在实际应用中的效果和优势。本文纯技术层面,假设数据库保密工作未严格按照数据隔离的标准做的规范性防范措施。

关键词

招投标,标段识别码,加密算法,盲抽,数据安全,MD5

1. 引言

在招投标过程中,专家评审是决定中标单位的关键环节。很多地方试点专家“盲抽”和技术标“盲评”,极大的规避了招投标中串标的风险,原理上杜绝了串标的可能,现实中可能会因为管理或者网络安全等方面的因素形同虚设,本文就专家盲评在具体实施可能出现的风险给出解决方案。

2 专家盲抽风险

“专家盲抽”通常是在评审过程中,为了确保公平性和随机性,对评审专家进行随机抽取的过程。且要保证专家在评审前和评审时并不知道自己评审的项目是什么。本文只针对双盲中的专家盲抽进行阐述。现有系统基本上大多省份都已经做到可以随机抽取专家,且在应用层面上不让专家知道自己评审的项目是什么。风险存在与数据层面,举例说明。以安徽省招投标数据规范中的规定。项目标段标识码在注册信息,招标文件,招标公告等数据表中皆有,且级联,在专家抽取表中也存在此标段,因为数据库层面可以轻易获知专家所评审的项目是哪一个。

数据库层面的保密需要专业级别的保密措施,强如中国移动,腾讯,阿里巴巴,各类银行系统等大型企业有安全的保密措施,也未必能做到百分百保密,大多数地市的招投标系统没有专业级别的数据隔离和保密措施(内在管理风险)。加上招投标系统因异地评标,需运行在互联网中(外来风险),且经常需要在省地市交换数据,数据级别的数据泄露的可能性风险极大。因为为了一劳永逸,设计如下加密算法。

3 解决措施。

设计思路,数据级别,招标信息发布系统和 评标系统,专家抽取系统的标段识别码 ,如一致,很容易被人筛选出关联关系,所以只要通过算法对专家抽取系统的标段识别码进行加密,让不同数据表和系统中的标段识别码不一致,就可以杜彻底杜绝外在风险。而算法的保密性和周期性密钥的变更可以彻底杜绝内在风险。假设有三个系统,分别为 招标系统,专家系统,评标系统。

这三个系统分别按顺序有三个表格如下, 项目标段表, 专家抽取表,评标表

(我直接把Bidding Deadline投标截止时间放在各个表中,简化设计,现实中可能会存于其他关联表中,其他均采用此种简化设计,其他字段与算法无关省略)

 以前系统设计 三个表中的关系是 专家抽取表和评标文件表 中的section对应项目标段标的ID。 如明文,在数据级别中即可被人轻易关联,失去盲抽盲评的效果。

重新设计,项目标段表中增加一个section_id 和ID的区别在于,ID是项目标段在整个系统中和其他表做关联。section只和评标系统中的评标表和 专家抽取系统中的抽取表做隐性关联。

设计隐性关联,让其中的字段在数据级别毫无关联,但是可以通过算法建立关联。

设计不可逆非加密算法对 项目标段表 中的ID进行加密后,存储于专家抽取表和评标文件表。专家抽取表和评标文件表中的投标截取时间存储一个

4 可验证算法设计

4.1 加密算法

设计一个算法进行不可逆加密,选择最为简单常用的md5+key算法。或者其他方法均可,要求不可逆算法。

算法表述为function 加密算法(项目标段表:ID,key )key采用一个10位以上复杂密码。

设计3个KEY(key1,key2,key3)

采用不同KEY加密得到的密文存入不同系统不同的表中的sectionID中。

加密算法(项目标段表:ID,key1)--》项目标段表.section_Id(直接同系统写入)

加密算法(项目标段表:ID,key2)--》专家抽取表.section_Id(远程推送)

加密算法(项目标段表:ID,key3)--》评标表.section_Id(远程推送)

注:加密算法(项目标段表:ID,key2) 加密算法(项目标段表:ID,key3)在招标系统中,计算出来,不保存。只做推送用。

专家抽取表.section_Id和评标表.section_Id的数值由 项目标段表所在的系统 经由算法得出。没有直接关联,除非调用项目标段表

  一个python实现实例

  

import hashlib

def md5_encrypt(plaintext, password):

    if len(password) != 10 or not any(c.islower() for c in password) or not any(c.isupper() for c in password):

        raise ValueError("Password must be 10 characters long with both uppercase and lowercase letters.")

    

    # 将明文与密码结合起来

    combined_text = plaintext + password

    

    # 计算 MD5 散列值

    md5_hash = hashlib.md5(combined_text.encode()).hexdigest()

    

    return md5_hash

# 示例使用

plaintext = "HelloWorld"

password = "Abcdef1234"  # 10 位包含大小写字母的密码

ciphertext = md5_encrypt(plaintext, password)

print("明文:", plaintext)print("密码:", password)print("密文:", ciphertext)

压力测试

#压力测试 100 万次

start_time = time.time()

for _ in range(1000000):

md5_encrypt(plaintext, password)

end_time = time.time()

elapsed_time = end_time - start_time

print(f"100万次加密操作的耗时: {elapsed_time} 秒")

压力测试100万次耗时 4.30微秒 (服务器)

 0.8868439197540283(i7-14900) 对性能影响很小。

4.2 隐性关联建立。

设计专家系统根据SECTION_ID匹配 招标系统中 项目标段ID的方法。

设计方法 得到招标系统标段ID方法(专家系统::标段识别码,投标截止时间)

(现有制度改进可以和算法匹配的地方:投标截止日期 为了增加混淆性, 如果从制度上实现,评标室设置所有专家报道时间为早于每天所有标评标时间的一个时间点。就可以增加保密性。)

根据截止时间把所有当前时间下 该招标系统中 项目标段表 ID 筛选出来 。对所有ID用KEY2依次进行加密算法。得到的值和专家系统ID 相同的,返回。

 示例 KEY 1=”Abc1234567” KEY 2=”Efg1234567” KEY 3=”Hij1234567”

 项目标段表

 ID

SectionID

93839665-0daf-404a-b2cb-7ff548e84c77

8f9c133404ec47b9646ed32054cc24e9

46c08c45-4a5d-4e04-9cf0-cfadf75ec0d1

818eb8af05bc0ad63914e0d858768c06

60d7170a-8a91-4f2c-b7e5-6b545919c01f

4ef01b020fc605d43dc5f64cfc4e386b

推送 专家抽取表内容为,

 ID

SectionID

。。自己定义唯一标识码

06f8904d1c8acd4919ea76635045746a

。。

57b13ac2daf0f428bc87d5ebd74ead52

。。

ef90df3d44745fcf96cdb27e45514f2f

评标表

 ID

SectionID

。。自己定义唯一标识码

1274b99327a2745516cd1b713a488a2d

。。

642233c4cd4a0baf34bef90ebb658037

。。

c26805631ff49c715e64708db2e03afd

  得到招标系统标段ID方法(“06f8904d1c8acd4919ea76635045746a”,“2024-01-01 09:00:00”)此方法返回”93839665-0daf-404a-b2cb-7ff548e84c77”

  具体算法过程我用文字表述:

1 根据截止日期在项目标段表筛选出所有项目标段表的ID数组 (得到ids= ["93839665-0daf-404a-b2cb-7ff548e84c77","46c08c45-4a5d-4e04-9cf0-cfadf75ec0d1","60d7170a-8a91-4f2c-b7e5-6b545919c01f"])

2 遍历数组对 每个ID以KEY2方式进行加密。

加密算法(“93839665-0daf-404a-b2cb-7ff548e84c77”,key2) =”06f8904d1c8acd4919ea76635045746a”

加密算法(46c08c45-4a5d-4e04-9cf0-cfadf75ec0d1”,key2=”57b13ac2daf0f428bc87d5ebd74ead52”

加密算法(“60d7170a-8a91-4f2c-b7e5-6b545919c01f”,key2)=”ef90df3d44745fcf96cdb27e45514f2f”

06f8904d1c8acd4919ea76635045746a 匹配的是93839665-0daf-404a-b2cb-7ff548e84c77 ,所以返回的是 93839665-0daf-404a-b2cb-7ff548e84c77 

5. 结论

可验证算法在招投标领域的专家“盲抽”应用,有效提高了评审过程的公正性和透明度,避免了传统专家选择方法中的潜在问题。未来,可以进一步优化算法,结合大数据和人工智能技术,提高专家选择的智能化和精准度。另外在管理中可以通过定期更换KEY,按月更换KEY在表格中增加月份字段。改进算法,进行更好级别的安全保密措施。

参考文献

招投标管理办法.

评审专家选择及管理规范.

随机抽取算法及其应用研究.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/369978.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Nginx】docker运行Nginx及配置

Nginx镜像的获取 直接从Docker Hub拉取Nginx镜像通过Dockerfile构建Nginx镜像后拉取 二者区别 主要区别在于定制化程度和构建过程的控制: 直接拉取Nginx镜像: 简便性:直接使用docker pull nginx命令可以快速拉取官方的Nginx镜像。这个过程…

SpringBoot 启动流程四

SpringBoot启动流程四 前面这个创建对象是初始化SpringApplication对象 是加载了SpringBoot程序的所有相关配置 我们接下来要将这个run方法 run过程是一个运行 初始化容器 我们看我们的运行结果是得到一个ConfigurableApplicationContext对象 package com.bigdata1421.star…

【Android】Android基础--显式Intent和隐式Intent

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

STM32和DHT11使用显示温湿度度(代码理解)+单总线协议

基于STM32CT,利用DHT11采集温湿度数据,在OLED上显示。一定要阅读DHT11数据手册。 1、 DHT11温湿度传感器 引脚说明 1、VDD 供电3.3~5.5V DC 2、DATA 串行数据,单总线 3、NC 空脚 4、GND 接地,电源负极 硬件电路 微…

【Linux进程】进程优先级 Linux 2.6内核进程的调度

前言 进程是资源分配的基本单位, 在OS中存在这很多的进程, 那么就必然存在着资源竞争的问题, 操作系统是如何进行资源分配的? 对于多个进程同时运行, 操作系统又是如何调度达到并发呢? 本文将以Linux kernel 2.6为例 , 向大家介绍进程在操作系统中 (OS) 的调度原理; 1. 进程优…

嵌入式linux面试1

1. linux 1.1. Window系统和Linux系统的区别 linux区分大小写windows在dos(磁盘操作系统)界面命令下不区分大小写; 1.2. 文件格式区分 windows用扩展名区分文件;如.exe代表执行文件,.txt代表文本文件,.…

.net 调用海康SDK的跨平台解决方案

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔序言 上2篇海康SDK使用以及常见的坑…

玩转Easysearch语法

Elasticsearch 是一个基于Apache Lucene的开源分布式搜索和分析引擎,广泛应用于全文搜索、结构化搜索、分析等多种场景。 Easysearch 作为Elasticsearch 的国产化替代方案,不仅保持了与原生Elasticsearch 的高度兼容性,还在功能、性能、稳定性…

Python基础小知识问答系列-高效遍历多个不同类型元素的迭代器

1. 问题: 当需要对多个迭代器进行相同遍历操作时,如何避免因为迭代器之间的类型或者迭代器元素 数量过大引发的问题? 2. 解决方法: 使用itertools模块中的chain函数。 示例: from itertools import chainlist_a [2,…

C语言之Const关键字与指针

目录 1 前言2 变量与指针的储存方式3 const int *var;int *const var;const int *const var;理解与区分4 总结 1 前言 实际开发过程中经常遇到const关键字作用于指针的情况,例如:const int *var;int *const var;const…

【前端】从零开始学习编写HTML

目录 一、什么是前端 二、什么是HTML 三、HTML文件的基本结构 四、HTML常见标签 4.1 注释标签 4.2 标题标签 4.3 段落标签 4.4 换行标签 4.5 格式化标签 4.6 图片标签 4.7 超链接标签 4.8 表格标签 4.9 列表标签 4.10 表单标签 (1)form标…

【vue动态组件】VUE使用component :is 实现在多个组件间来回切换

VUE使用component :is 实现在多个组件间来回切换 component :is 动态父子组件传值 相关代码实现&#xff1a; <component:is"vuecomponent"></component>import componentA from xxx; import componentB from xxx; import componentC from xxx;switch(…

电脑f盘的数据回收站清空了能恢复吗

随着信息技术的飞速发展&#xff0c;电脑已成为我们日常生活和工作中不可或缺的设备。然而&#xff0c;数据的丢失或误删往往会给人们带来极大的困扰。尤其是当F盘的数据在回收站被清空后&#xff0c;许多人会陷入绝望&#xff0c;认为这些数据已无法挽回。但事实真的如此吗&am…

windows server2016搭建AD域服务器

文章目录 一、背景二、搭建AD域服务器步骤三、生成可供java程序使用的keystore文件四、导出某用户的keytab文件五、主机配置hosts文件六、主机确认是否能ping通本人其他相关文章链接 一、背景 亲测可用,之前搜索了很多博客&#xff0c;啥样的都有&#xff0c;就是不介绍报错以…

STM32-I2C硬件外设

本博文建议与我上一篇I2C 通信协议​​​​​​共同理解 合成一套关于I2C软硬件体系 STM32内部集成了硬件I2C收发电路&#xff0c;可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能&#xff0c;减轻CPU的负担 特点&#xff1a; 多主机功能&#x…

利用border绘制三角技巧

绘制三角形的效果如图 <html lang"zh-cn"> <head><meta charset"UTF-8"><title>demo</title><style>* {margin: 0;padding: 0;}.box {/* 盒子宽高改成零就变成三角形 &#xff0c;需要哪个方向的三角形就设置哪个方向…

猫狗图像分类-划分数据集

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

大学教师门诊预约小程序-计算机毕业设计源码73068

摘要 在当今数字化、信息化的浪潮中&#xff0c;大学校园的服务管理正朝着智能化、便捷化的方向迈进。为了优化大学教师的医疗体验&#xff0c;提升门诊预约的效率和便捷性&#xff0c;我们基于Spring Boot框架设计并实现了一款大学教师门诊预约小程序。该小程序不仅提供了传统…

【吊打面试官系列-MyBatis面试题】MyBatis 实现一对一有几种方式?具体怎么操作的?

大家好&#xff0c;我是锋哥。今天分享关于 【MyBatis 实现一对一有几种方式?具体怎么操作的&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MyBatis 实现一对一有几种方式?具体怎么操作的&#xff1f; 有联合查询和嵌套查询,联合查询是几个表联合查询,只查询…

C# Application.DoEvents()的作用

文章目录 1、详解 Application.DoEvents()2、示例处理用户事件响应系统事件控制台输出游戏和多媒体应用与操作系统的交互 3、注意事项总结 Application.DoEvents() 是 .NET 框架中的一个方法&#xff0c;它主要用于处理消息队列中的事件。在 Windows 应用程序中&#xff0c;当一…