使用密钥对 python 中的 csv 文件进行哈希处理
Hashing a csv file in python with a key
我有一个包含 1000 多个电子邮件地址的 csv 文件,我想使用 SHA256 HMAC 和一个编码为 Base64 的共享密钥对其进行哈希处理。
有一个类似的问题 ,但我无法调整解决方案来为我工作。我是 python 的新手,我不知道在哪里更改代码才能使用共享密钥。
这是对答案稍作改编的代码:
import csv
import hashlib
import hmac
import base64
IN_PATH = 'test.csv'
OUT_PATH = 'test_hashed.csv'
ENCODING = 'utf8'
HASH_COLUMNS = dict(Mail='md5')
def main():
with open(IN_PATH, 'rt', encoding=ENCODING, newline='') as in_file, \
open(OUT_PATH, 'wt', encoding=ENCODING, newline='') as out_file:
reader = csv.DictReader(in_file)
writer = csv.DictWriter(out_file, reader.fieldnames)
writer.writeheader()
for row in reader:
for column, method in HASH_COLUMNS.items():
data = row[column].encode(ENCODING)
digest = hashlib.new(method, data).hexdigest()
row[column] = '0x' + digest.upper()
writer.writerow(row)
if __name__ == '__main__':
main()
输入文件 (.csv) 如下所示:
Mail
DHSKA@gmail.com
DJÖANw12@gmail.com
JSNÖS83@ymail.com
HDKDLSA@gmail.com
KKKDLAmS19@yamil.com
使用上面的代码,输出文件如下所示:
0xB6A77B6EB853CC4CC8342B312293FA9C
0xEB439592D8EEC2A38A597350EF80E512
0x833EB6AEC1D03D7D8C94606E0D749B80
0x8007D8D1702E8A749EBD6033A52A7897
0x415E067487C4A5FBDB86AB0F855DB114
但是因为我确实想使用带有密钥和 sha256 的 HMAC,所以上面的解决方案对我不起作用,我不知道如何合并这种方法。
关键是这样的:
123Abc
我试图做这样的事情,但对于整个文件:
import hmac
import hashlib
import base64
secret = "123Abc"
secret_bytes = bytes(secret, 'latin-1')
data = "DHSKA@gmail.com"
data_bytes = bytes(data, 'latin-1')
digest = hmac.new(secret_bytes, msg=data_bytes, digestmod=hashlib.sha256).digest()
signature = base64.b64encode(digest).decode()
因此,我的问题是如何在上面的代码中使用密钥合并 HMAC SHA 256 哈希?我只是不知道要更改哪些参数?
我认为你不必为查字典而烦恼;您在这里没有可变数量的列,您只是将转换应用于一列。
如果您只是将工作的 HMAC 方法放入函数中,将会更容易理解:
import hmac
import hashlib
import base64
secret = "123Abc"
secret_bytes = bytes(secret, 'latin-1')
def create_signature(email, secret_bytes):
data_bytes = email.encode('latin-1')
digest = hmac.new(secret_bytes, msg=data_bytes, digestmod=hashlib.sha256).digest()
signature = base64.b64encode(digest).decode()
return signature
这现在可以从电子邮件地址和您的(编码的)秘密中巧妙地生成一个带有 HMAC 摘要的 Base64 字符串:
>>> create_signature('DHSKA@gmail.com', secret_bytes)
'3KaSw4QeA5l0rz49uutaDGemn4Et4CQnbnngm6mmpjE='
现在您可以将其应用于 'Mail'
列值,并写出包含结果的新 CSV:
with open(IN_PATH, 'rt', encoding=ENCODING, newline='') as in_file, \
open(OUT_PATH, 'wt', encoding=ENCODING, newline='') as out_file:
reader = csv.DictReader(in_file)
writer = csv.DictWriter(out_file, reader.fieldnames)
writer.writeheader()
for row in reader:
row['Mail'] = create_signature(row['Mail'], secret_bytes)
writer.writerow(row)
演示:
>>> import sys, csv, io
>>> demo_input = io.StringIO('''\
... Mail
... DHSKA@gmail.com
... DJÖANw12@gmail.com
... JSNÖS83@ymail.com
... HDKDLSA@gmail.com
... KKKDLAmS19@yamil.com
... ''')
>>> demo_output = io.StringIO()
>>> with demo_input as in_file:
... reader = csv.DictReader(in_file)
... writer = csv.DictWriter(demo_output, reader.fieldnames)
... writer.writeheader()
... for row in reader:
... row['Mail'] = create_signature(row['Mail'], secret_bytes)
... writer.writerow(row)
...
46
46
46
46
46
>>> print(demo_output.getvalue())
Mail
3KaSw4QeA5l0rz49uutaDGemn4Et4CQnbnngm6mmpjE=
dP9IU66yKnYP/6mFRZ6TAAAN3lmxAcUPk9o1iFfpGDs=
ajNdCZF8ndw2SrgtSzcVCbeSpFsXI/Z6Ep0IC2fj+WU=
TgeFEj8CgvcQbVcLHTIIY1ULLnYkWAZaia5k01IQiJY=
Xu94abwV/5/HUXY+T3NpUgulGvew+L0UYzkPuRSv/98=
我有一个包含 1000 多个电子邮件地址的 csv 文件,我想使用 SHA256 HMAC 和一个编码为 Base64 的共享密钥对其进行哈希处理。
有一个类似的问题
这是对答案稍作改编的代码:
import csv
import hashlib
import hmac
import base64
IN_PATH = 'test.csv'
OUT_PATH = 'test_hashed.csv'
ENCODING = 'utf8'
HASH_COLUMNS = dict(Mail='md5')
def main():
with open(IN_PATH, 'rt', encoding=ENCODING, newline='') as in_file, \
open(OUT_PATH, 'wt', encoding=ENCODING, newline='') as out_file:
reader = csv.DictReader(in_file)
writer = csv.DictWriter(out_file, reader.fieldnames)
writer.writeheader()
for row in reader:
for column, method in HASH_COLUMNS.items():
data = row[column].encode(ENCODING)
digest = hashlib.new(method, data).hexdigest()
row[column] = '0x' + digest.upper()
writer.writerow(row)
if __name__ == '__main__':
main()
输入文件 (.csv) 如下所示:
Mail
DHSKA@gmail.com
DJÖANw12@gmail.com
JSNÖS83@ymail.com
HDKDLSA@gmail.com
KKKDLAmS19@yamil.com
使用上面的代码,输出文件如下所示:
0xB6A77B6EB853CC4CC8342B312293FA9C
0xEB439592D8EEC2A38A597350EF80E512
0x833EB6AEC1D03D7D8C94606E0D749B80
0x8007D8D1702E8A749EBD6033A52A7897
0x415E067487C4A5FBDB86AB0F855DB114
但是因为我确实想使用带有密钥和 sha256 的 HMAC,所以上面的解决方案对我不起作用,我不知道如何合并这种方法。
关键是这样的:
123Abc
我试图做这样的事情,但对于整个文件:
import hmac
import hashlib
import base64
secret = "123Abc"
secret_bytes = bytes(secret, 'latin-1')
data = "DHSKA@gmail.com"
data_bytes = bytes(data, 'latin-1')
digest = hmac.new(secret_bytes, msg=data_bytes, digestmod=hashlib.sha256).digest()
signature = base64.b64encode(digest).decode()
因此,我的问题是如何在上面的代码中使用密钥合并 HMAC SHA 256 哈希?我只是不知道要更改哪些参数?
我认为你不必为查字典而烦恼;您在这里没有可变数量的列,您只是将转换应用于一列。
如果您只是将工作的 HMAC 方法放入函数中,将会更容易理解:
import hmac
import hashlib
import base64
secret = "123Abc"
secret_bytes = bytes(secret, 'latin-1')
def create_signature(email, secret_bytes):
data_bytes = email.encode('latin-1')
digest = hmac.new(secret_bytes, msg=data_bytes, digestmod=hashlib.sha256).digest()
signature = base64.b64encode(digest).decode()
return signature
这现在可以从电子邮件地址和您的(编码的)秘密中巧妙地生成一个带有 HMAC 摘要的 Base64 字符串:
>>> create_signature('DHSKA@gmail.com', secret_bytes)
'3KaSw4QeA5l0rz49uutaDGemn4Et4CQnbnngm6mmpjE='
现在您可以将其应用于 'Mail'
列值,并写出包含结果的新 CSV:
with open(IN_PATH, 'rt', encoding=ENCODING, newline='') as in_file, \
open(OUT_PATH, 'wt', encoding=ENCODING, newline='') as out_file:
reader = csv.DictReader(in_file)
writer = csv.DictWriter(out_file, reader.fieldnames)
writer.writeheader()
for row in reader:
row['Mail'] = create_signature(row['Mail'], secret_bytes)
writer.writerow(row)
演示:
>>> import sys, csv, io
>>> demo_input = io.StringIO('''\
... Mail
... DHSKA@gmail.com
... DJÖANw12@gmail.com
... JSNÖS83@ymail.com
... HDKDLSA@gmail.com
... KKKDLAmS19@yamil.com
... ''')
>>> demo_output = io.StringIO()
>>> with demo_input as in_file:
... reader = csv.DictReader(in_file)
... writer = csv.DictWriter(demo_output, reader.fieldnames)
... writer.writeheader()
... for row in reader:
... row['Mail'] = create_signature(row['Mail'], secret_bytes)
... writer.writerow(row)
...
46
46
46
46
46
>>> print(demo_output.getvalue())
Mail
3KaSw4QeA5l0rz49uutaDGemn4Et4CQnbnngm6mmpjE=
dP9IU66yKnYP/6mFRZ6TAAAN3lmxAcUPk9o1iFfpGDs=
ajNdCZF8ndw2SrgtSzcVCbeSpFsXI/Z6Ep0IC2fj+WU=
TgeFEj8CgvcQbVcLHTIIY1ULLnYkWAZaia5k01IQiJY=
Xu94abwV/5/HUXY+T3NpUgulGvew+L0UYzkPuRSv/98=