首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用HMAC传递要验证的字符串安全吗?

使用HMAC传递要验证的字符串安全吗?
EN

Security用户
提问于 2020-02-04 02:14:47
回答 1查看 247关注 0票数 0

我正在处理Django项目,并试图创建一个REST来验证电子邮件,而不使用任何数据库。我现在的服务器连接是HTTP,而不是HTTPS。

因此,使用API端点的人发电子邮件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
REQUEST:

curl --location --request POST 'http://127.0.0.1:8000/api/openlogin' \
--header 'Content-Type: application/json' \
--data-raw '{
"email":"test13@test.com",
}'

现在我正在生成一个随机的6位数,例如。435667,一封电子邮件将发送给test13@test.com

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
send_mail('PIN TO VERIFY','ENTER THE PIN 435667',None,[test13@test.com])

435667的HMAC值作为对API调用的响应发送:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    raw = '435667'.encode("utf-8")
    key = 'SOME_SECRET_KEY'.encode('utf-8')
    hashed = hmac.new(key, raw, hashlib.sha1)
    pin_hmac_hash = base64.encodebytes(hashed.digest()).decode('utf-8')
    eg: pin_hmac_hash = "SOME_HMAC_HASH_OF_PIN"

因此,/api/openlogin的响应将是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
'email': 'test13@test.com'
'pin': "SOME_HMAC_HASH_OF_PIN"
}

现在,用户将返回响应中的PIN和HMAC哈希:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl --location --request POST 'http://127.0.0.1:8000/api/verifypin' \
--header 'Content-Type: application/json' \
--data-raw '{
'pin': "SOME_HMAC_HASH_OF_PIN",
'email': 'test13@test.com',
'emailed_pin':'435667'
}'

有人能猜到SOME_HMAC_HASH_OF_PIN的密码吗?

当然,我将进一步尝试使用JWT令牌来修改API。所以电子邮件不能被篡改。

这是PIN的一个例子,但它可以是任何敏感信息字符串。我能依靠HMAC吗?

EN

回答 1

Security用户

发布于 2020-02-04 02:34:05

听起来,您想要实现的是一个签名的URL,类似于Amazon。只要你的秘密是牢固和安全的,这听起来是一个合理的方式,以无状态的方式验证电子邮件地址。

目前,您只是在签名/使用PIN,这是您的代码中的一个问题。如果我从您的服务中得到一个有效的PIN/PIN_HASH组合,我仍然可以用一个新的电子邮件地址B提交这个有效的组合,它将通过您的验证测试。

我建议一个稍微不同的解决方案。使用时间戳代替PIN,并将其用作expirey日期。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
created_at = int(round(time.time() * 1000))
payload = email + "-" + created_at
hashed = hmac.new(key, payload, hashlib.sha1)

然后将创建的时间发送回服务器,而不是发夹。这允许您在验证hmac签名是正确的之后,也可以检查这个请求有多老,如果它超过x分钟,则拒绝它。

这仍然使您很容易在时间范围内重播攻击,如果您检查用户还不存在,如果用户还不存在,则拒绝api调用,这样就可以了。

PS:如果没有https,您仍然面临着有人在信息到达您的服务器之前拦截和窃取这些信息的风险。我强烈建议使用https (LetsEncrypt证书是免费的,容易获得)

票数 1
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/225326

复制
相关文章
如何在SQL Server中将表从一个数据库复制到另一个数据库
在某些情况下,作为DBA,您需要将模式和特定表的内容从数据库复制到同一实例中或在不同的SQL实例中,例如从生产数据库中复制特定表到开发人员以进行测试或排除故障。 SQL Server提供了许多方法,可以用来执行表的数据和模式复制过程。为了研究这些方法中的每一个,我们将考虑下面的场景: 托管SQL服务器:localhost。这两个数据库都驻留在同一个SQL Server 2014实例中。 源数据库:AdventureWorks2012。 目标数据库:SQLShackDemo。 将从源数据库复制到目标数据库的表
程序你好
2018/07/20
8.3K0
flutter - 如何在Dart/Flutter中将某些元素从一个Map复制到新Map中?
由于keys返回 map 键的Iterable<String>,因此您可以使用where方法检查所需的键,然后可以基于旧 map 值填充值。
徐建国
2021/08/30
1.4K0
php获取所有节点的父节点和子节点
根据子节点获取所有的父节点以及父节点的父节点.. <?php $src = '[{"id":"1","name":"媒体(白名单)","pid":"0"},{"id":"2","name":"党媒公
黄啊码
2020/05/29
6.2K0
java 把文件从一个目录复制到另一个目录
方法一:简单粗暴,直接使用copy(),如果目标存在,先使用delete()删除,再复制;
崔笑颜
2020/06/08
1.9K0
Linux将一个文件夹或文件夹下的所有内容复制到另一个文件夹
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/124758.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/21
5.4K0
Linux将一个文件夹或文件夹下的所有内容复制到另一个文件夹
[译]将 Kubernetes 扩展至7500个节点
我们已经将 Kubernetes 集群扩展到了7500个节点,该集群主要是为 GPT-3、CLIP 和 DALL·E 等大型模型提供可扩展的基础设施,同时也为神经语言模型的缩放定律等快速的小规模迭代研究提供基础支持。将单个 Kubernetes 集群扩展到这种规模是很少见的,因而需要特别小心,但好处是一个简单的基础设施,使我们的机器学习研究团队能够更快地迁移和扩展,而不需要更改他们的代码。
我是阳明
2021/03/01
7270
SQL根据指定节点ID获取所有父级节点和子级节点
根据指定节点ID获取所有父节点 with temp as( select * from dbo.Category where Id=493 --表的主键ID union all select t.* from temp,dbo.Category t where temp.Pid=t.Id --父级ID=子级ID )select * from temp order by Level; [查询结果] 根据指定节点ID获取所有子节点 with temp as( select * from dbo.Category
段邵华
2019/08/01
6K0
java根据子节点获取它对应的所有父节点_java根据父节点查找子节点
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/01
6.9K0
树形结构已知子节点获取子节点所有父节点——任意目录/树
JS 树形结构 根据子节点找到所有上级,比如element-tree,已知路由上的子结点id,如何回填的 展开目录树?
周陆军博客
2023/05/07
3.3K0
将一个CentOS环境复制到另一个CentOS
「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」。
Java廖志伟
2022/03/07
5700
将一个CentOS环境复制到另一个CentOS
将一个CentOS环境复制到另一个CentOS
将一个CentOS环境复制到另一个CentOs,实现环境迁移或备份的功能 将CentOS2复制一份新的CentOS3出来,步骤如下: 创建新的CentOS3 这里的名称改吃CentOS3,后面的文件改名就是对应的这个名称 ISO映像文件路径修改,每个CentOS单独用一个ISO映像文件 直接启动 修改网络ip cd /etc/sysconfig/network-scripts/ vi ifc
Java廖志伟
2022/09/29
1.6K0
将一个CentOS环境复制到另一个CentOS
【Longhorn】能否部署到专用的节点,业务使用其他节点
Longhorn 作为分布式存储,当然是有点复杂的…作为集群的使用者,当然会有一种想法就是能否在集群中只用几个节点部署 Longhorn,万一出问题了,不影响用户在节点上的其他工作负载,就是单纯想隔离了。
runzhliu
2022/04/13
6960
【Longhorn】能否部署到专用的节点,业务使用其他节点
属性 元素的内容 创建,插入和删除节点 虚拟节点
表示HTML文档元素的HTMLElement对象定义了读/写属性。映射了元素的HTML属性。HTMLElement定义了通用的HTTP属性。以及事件处理程序的属性。特定的Element子类型为其元素定义了特定的属性。
mySoul
2018/08/07
2.4K0
如何在集群里服役新节点、退役旧节点(DataNode)
①准备机器,配置好JDK、hadoop的环境变量,在hdfs-site.xml和yarn-site.xml文件中分别配置NameNode和ResourceManager所在主机名 ②待服役成功后,启动datanode和nodemanager进程即可 ③服役了新的DN节点后,可以执行再平衡的命令,这个命令可以将集群中块进行重新平衡分配,实现负载均衡: ./start-balancer.sh
孙晨c
2020/07/14
8310
如何在100个节点集群上模拟10000个节点的集群?让DynoYARN来模拟吧
DynoYARN 是一种用于按需启动 YARN 集群并运行模拟 YARN 工作负载以进行规模测试的工具。由Linkedin开源。它可以在 100 个节点的 Hadoop 集群上模拟 10,000 个节点的 YARN 集群性能。
从大数据到人工智能
2022/04/08
8060
​[AAAI | 论文简读] GNN中非属性节点分类的优先标记
Preferential Labeling for Unattributed Node Classification in GNNs
智能生信
2022/12/29
4860
​[AAAI | 论文简读] GNN中非属性节点分类的优先标记
xpath库详解xpath入门获取所有节点 //子节点 /父节点 ..属性匹配 @文本获取按序选择节点轴选择
python爬虫抓取网页内容,需要对html或xml结构的数据进行解析,如果用正则,单是写正则表达式就让很多望而生畏了。
章鱼喵
2018/09/26
25.3K0
xpath库详解xpath入门获取所有节点 //子节点 /父节点 ..属性匹配 @文本获取按序选择节点轴选择
jquery 元素节点操作 - 创建节点、插入节点、删除节点
前面的篇章对于jquery的元素操作大部分是使用html()的方式来操作,这种直接使用字符串创建的方式也是性能最高的。
Devops海洋的渔夫
2019/05/31
9K0
点击加载更多

相似问题

XSLT在xml中将值从一个节点复制到另一个节点

10

XSLT:将属性从一个节点复制到另一个节点

22

XSLT -复制所有其他节点,添加1个新节点

42

将所有xml属性从一个节点复制到另一个节点

39

Drupal -自动将字段内容从一个节点复制到另一个节点

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文