加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 如何使用SHA256创建密钥,值对和秘密签名的标记?

发布时间:2020-12-16 06:18:33 所属栏目:大数据 来源:网络整理
导读:我想在这些隐藏字段的键值对的sha编码字符串的帮助下验证一些隐藏的输入字段(以确保它们在提交时未被更改).我在网上看到了这个例子,但我不明白如何编码和 使用动态秘密值解码值.有人可以帮我理解如何在perl中执行此操作吗? 哪种签名类型(MD5,SHA1,SHA256等)
我想在这些隐藏字段的键值对的sha编码字符串的帮助下验证一些隐藏的输入字段(以确保它们在提交时未被更改).我在网上看到了这个例子,但我不明白如何编码和
使用动态秘密值解码值.有人可以帮我理解如何在perl中执行此操作吗?

哪种签名类型(MD5,SHA1,SHA256等)在性能和安全性方面有很好的平衡?

更新

那么,一旦你编码了字符串,你如何解码?

解决方法

你真正需要的不是一个普通的哈希函数,而是一个 message authentication code,如 HMAC.既然你说你想使用SHA-256,你可能会喜欢HMAC_SHA256,它可以通过 Digest::SHA模块在Perl中使用:

use Digest::SHA qw(hmac_sha256_base64);

my $mac = hmac_sha256_base64( $string,$key );

这里,$key是一个任意键,你应该保密,$string包含你想要签名的数据.要将其应用于更复杂的数据结构(例如键值对的散列),首先需要将其转换为字符串.有几种方法可以做到这一点;例如,您可以使用Storable:

use Storable qw(freeze);

sub pairs_to_string {
    local $Storable::canonical = 1;
    my %hash = @_;
    return freeze( %hash );
}

您还可以进行URL编码,如suggested by David Schwartz.重要的是,无论您使用何种方法,在给定与输入相同的哈希时,它应始终返回完全相同的字符串.

然后,在将数据发送给用户之前,为它们计算MAC并将其作为数据中的额外字段包含在内.当您收到数据时,删除MAC字段(并保存其值),重新计算剩余字段的MAC并将其与您收到的值进行比较.如果它们不匹配,则某人(或某物)已经篡改了数据.像这样:

my $key = "secret";
sub mac { hmac_sha256_base64( pairs_to_string(@_),$key ) }

# before sending data to client:
my %data = (foo => "something",bar => "whatever");
$data{mac} = mac( %data );

# after receiving %data back from client:
my $mac = delete $data{mac};
die "MAC mismatch" if $mac ne mac( %data );

请注意,此技术不会自动阻止一些潜在的技巧,例如replay attacks:一旦您将数据和MAC发送给用户,他们将学习与特定数据集相对应的MAC,并且可能会替换这些字段在以后的形式中,从早期表单中保存值.为了保护自己免受此类攻击,您应该在受MAC保护的数据中包含足够的识别信息,以确保您可以检测到任何可能有害的重放.理想情况下,您希望在每个表单中包含唯一ID,并检查是否曾经两次提交过ID,但这可能并不总是实用.如果做不到这一点,最好包括一个用户ID(以便恶意用户不会欺骗别人提交他们的数据)和表单ID(这样用户就无法将数据从一个表单复制到另一个表单)并且可能是表格中的时间戳和/或会话ID(以便您可以拒绝旧数据)(以及MAC计算中).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读