摘要
在招投標過程中,標段(包)識別碼的安全性至關重要。本文提出了一種基于可驗證算法的標段識別碼加密方法,以確保其在專家“盲抽”過程中的保密性和可信性。通過對不同表的標段識別碼進行全量加密,并通過匹配驗證其一致性,有效防范數據庫層級的泄密和內鬼行為。本文詳細描述了該算法的設計與實現,并探討了其在實際應用中的效果和優勢。本文純技術層面,假設數據庫保密工作未嚴格按照數據隔離的標準做的規范性防范措施。
關鍵詞
招投標,標段識別碼,加密算法,盲抽,數據安全,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在表格中增加月份字段。改進算法,進行更好級別的安全保密措施。
參考文獻
招投標管理辦法.
評審專家選擇及管理規范.
隨機抽取算法及其應用研究.