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

时间:2018-02-28 07:51:27

标签: python python-3.x sha256 hmac

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

有一个类似的问题here,但我无法使解决方案适合我。我是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哈希诡计?我只是无法确定要更改哪些参数?

1 个答案:

答案 0 :(得分:1)

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

如果您将正在使用的HMAC方法放入函数中,它会更容易理解:

PopOver

现在整齐地生成一个Base64字符串,其中包含来自电子邮件地址的HMAC摘要和您的(编码)秘密:

 showPopOver = () => {
    this.setState({
      popOverVisible: true
    })
 }
 ...
 <Popover ...
   visible={this.state.popOverVisible}>
   <span type="primary" onClick={this.showPopOver}>Click me (Popover Button)</span>
 </Popover>

现在,您可以将其应用于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 列值,并使用结果写出新的CSV:

>>> create_signature('DHSKA@gmail.com', secret_bytes)
'3KaSw4QeA5l0rz49uutaDGemn4Et4CQnbnngm6mmpjE='

演示:

'Mail'