perl – 如何使用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计算中). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |