使用密钥在python中散列csv文件

问题描述 投票:1回答:1

我有一个包含1000多个电子邮件的csv文件,我想使用SHA256 HMAC和共享密钥进行哈希处理,编码为Base64。

有一个类似的问题qazxsw poi,但我无法使解决方案适合我。我是python的新手,我不知道在哪里更改代码以便使用共享密钥。

这是答案的略微改编的代码:

here

输入文件(.csv)如下所示:

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()

使用上面的代码,输出文件如下所示:

Mail
[email protected]
DJÖ[email protected]
JSNÖ[email protected]
[email protected]
[email protected]

但由于我确实想要使用带密钥和sha256的HMAC,上述解决方案对我不起作用,我不知道如何采用这种方法。

关键是这样的:

0xB6A77B6EB853CC4CC8342B312293FA9C
0xEB439592D8EEC2A38A597350EF80E512
0x833EB6AEC1D03D7D8C94606E0D749B80
0x8007D8D1702E8A749EBD6033A52A7897
0x415E067487C4A5FBDB86AB0F855DB114

我试图做这样的事情,但对于整个文件:

123Abc

因此,我的问题是如何在上面的代码中使用密钥时如何合并HMAC SHA 256哈希?我只是无法弄清楚要改变哪些参数?

python python-3.x sha256 hmac
1个回答
1
投票

我认为你不需要为字典烦恼;您在此处没有可变数量的列,您只是将转换应用于一列。

如果您将工作的HMAC方法放入函数中,则会更容易理解:

import hmac
import hashlib
import base64

secret = "123Abc"
secret_bytes = bytes(secret, 'latin-1')
data = "[email protected]"
data_bytes = bytes(data, 'latin-1')

digest = hmac.new(secret_bytes, msg=data_bytes, digestmod=hashlib.sha256).digest()
signature = base64.b64encode(digest).decode()

这现在整齐地生成一个Base64字符串,其中包含来自电子邮件地址的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

现在,您可以将其应用于>>> create_signature('[email protected]', secret_bytes) '3KaSw4QeA5l0rz49uutaDGemn4Et4CQnbnngm6mmpjE=' 列值,并使用结果写出新的CSV:

'Mail'

演示:

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)
© www.soinside.com 2019 - 2024. All rights reserved.