Recibí recientemente una tarea de prueba de cifrado de registros.
Los requisitos son más o menos de la siguiente manera: Cifrar los valores correspondientes de acuerdo a los llamados parámetros de salida y de entrada de palabras clave.
Palabras clave:
'mobileNo|custName|money|mobile|userNo|fullName|idNo|panNo|aadhaarNo|registerMobileNo|applyMobile|phone|name|aadhaarCardNo|aadhaarCardName|custRegisterPhoneNum|phoneNumber|idNumber|mobilePhone|middleName|firstName|number|surname|pan|oriPan|userId|password|cardNo|lastName|panCode|additionalMiddleName|PANNumber|panCard|PANId|pan_code'
Ejemplo: por
ejemplo, un registro de solicitudes es el siguiente:
2020-05-16 16:22:31.195 DEBUG [apv-workflow-pool-pool-20] [e9f469a5cf79451a97589795563f0cde#14|10.11.2.126||10.11.0.8] [in.qihoo.finance.apv.modules.credit.component.creditnodeflow.impl.AbstractCreditNodeFlowProvider:239] - start checkWhetherDecisionCredit,传入参数str={'isDecisionNode':'Y','creditAdapter':'Pboc'},request={~~idNo=大大大撒21~~ , rejectReasonCode3=, rejectReasonCode2=, rejectReasonCode1=,, id=1335, state=CRING, custNameMd5x=, creditOrg=, phaseNo=AP_CREDIT, idType=P, updatedBy=SYSTEM, applyChannel=APKKR_CH_00001, , priority=, decisionCode=APPROVED, rejectMsg3=, rejectMsg2=, , rejectMsg1=, idNoMd5x=, origState=, flowNo=CREDIT_APPROVE, , rejectMsg=, contractNo=, dateFinished=, ~~userNo=UR121212121212121,~~ remark=, dateApplSubmit=2020-05-16T16:21:01.000+0800, dateCreated=2020-05-16T16:21:01.000+0800, eventTypeList=, taskNo=5980494681853657088, apprAutoAmt=, applNo=2020051600000201, dateAppl=2020-05-16T16:21:01.000+0800, ~~mobileNo=6212121212, custName=H162616261621~~ },creditType=EquifaxLesseePboc
Para mostrar que las palabras clave son similares antes del cifrado: idNo = 大大 撒 21 mobileNo = 6212121212 userNo = UR121212121212121, ~~
Debería ser similar después del cifrado: idNo = 大 ***** 1 mobileNo = 6 ***** * 2 userNo = U ****** 1, ~
Los registros son relativamente pequeños. Es fácil juzgar si las palabras clave están encriptadas a simple vista, pero a menudo hay muchos registros y muchas palabras clave, y a simple vista prueba inevitablemente fallará.
Idea: Saque el registro del servicio, luego busque la cadena que contiene la palabra clave = según la comparación de palabras clave y sáquela. Si la contiene , estará encriptada, de lo contrario no estará encriptada. Y escríbalos en archivos por separado como registros.
el código se muestra a continuación:
import numpy as np
import main
#按行件文件保存到list
def read_txt(filename):
file = open(filename, "r",encoding='UTF-8')
list = file.readlines() # 每一行数据写入到list中
print(list)
lists = []
# 将txt文件转换成数组形式保存
for fields in list:
fields = fields.strip(); # fields.strip()用来删除字符串两端的空白字符。
# fields = fields.strip("\n"); # fields.strip("[]")用来删除字符串两端方括号。
# fields = fields.split(","); # fields.split(",")的作用是以逗号为分隔符,将字符串进行分隔。
lists.append(fields)
print(lists)
return lists
#按关键字模糊匹配,匹中的写入文件
def write_txt(keyword,filename1,filename2,filename):
# file = open(filename, 'a',encoding='UTF-8')
lis=read_txt(filename1)
for i in lis:
j = i.split(',')
for b in j:
#关键字加密的
if (keyword in b) and ('*' in b):
with open(filename, "a", encoding='UTF-8') as f:
f.write(b+"\n")
#关键字未加密的
elif (keyword in b) and ('*' not in b):
with open(filename2, "a", encoding='UTF-8') as f:
# if keyword in str(i) :
f.write(b + "\n")
if __name__=='__main__':
filename1=f'{main.BASE_DIR}/dataCenter/源文件.txt'
filename=f'{main.BASE_DIR}/dataCenter/加密.txt'
filename2=f'{main.BASE_DIR}/dataCenter/未加密.txt'
keyword='mobileNo|custName|money|mobile|userNo|fullName|idNo|panNo|aadhaarNo|registerMobileNo|applyMobile|phone|name|aadhaarCardNo|aadhaarCardName|custRegisterPhoneNum|phoneNumber|idNumber|mobilePhone|middleName|firstName|number|surname|pan|oriPan|userId|password|cardNo|lastName|panCode|additionalMiddleName|PANNumber|panCard|PANId|pan_code'
for keyword in keyword.split('|'):
keyword=keyword+'='
write_txt(keyword,filename1,filename2,filename)