我试图设计一个小的api,但是我有点坚持如何保护api.我已经阅读了关于如何做的一些文章,其中之一是:登录并检索一个apikey,然后用这个apikey哈希一些值,并发送哈希的字符串与请求一起回来,所以可以在服务器级别再次完成.

这是一个好办法还是这个危险的呢?

如果没有错过理解,为了避免在中间的人,我可以将请求url添加到将被散列的变量,或者不是适当的方式

此外,我的大脑也陷入如何使用时间戳,以避免使用相同的数据对相同的URL进行大量请求.

如果我的问题被问了1000次,我很抱歉.然而,我已经读了一些文章,现在仍然不清楚我的小api有什么办法.

从我所看到的和理解的,这应该是方式.

>公钥存储在应用程序中,让用户或应用程序登录.
>服务器为访问该特定用户创建私钥.或者这应该永远是一个人还是由一个人创造的静态值?
>用户请求发送与请求一起签名是hash_hmac(一些值私有密钥);
>服务器检查这些值是否正确,并通过从发送的值创建相同的哈希值.
>如果服务器生成相同的哈希,则该请求是有效的,然后可以执行.
这是他们走的路吗,或者我在这里错过了一些市长的事情.

为了使数据是下面的方式创建哈希的好方法?

$l_sPrivateKey = 'something returned by database when user loged in';
$l_aData = array();

foreach($_POST as $key => $value){
 if($key == 'signature') continue;
 $l_aData[$key] = $value;
}

//This should then be the same as $_POST['signature'];
hash_hmac('sha256',serialize($l_aData),$l_sPrivateKey,false);

您的输入将不胜感激
提前问候和感谢

安全远程密码协议(SRP6a)与HMAC符合您的要求

以下假设您的API是浏览器到服务器,因此JavaScript到PHP不是仅使用PHP的服务器到服务器. SRP将适用于两种情况,但下面的答案讨论了浏览器到服务器库.

使用Secure Remote Password协议来认证具有创建强会话密钥的副作用​​的API的用户.然后,您可以使用共享的强会话密钥来使用HMAC对API请求和响应进行签名.

RFC5054使用SRP而不是公钥来创建一个共享会话密钥来加密TLS流量.有一个implementation in OpenSSL.这表明SRP身份验证是一个绝对安全的替代公钥来创建一个安全的共享秘密.使用SRP的IMHO更方便解决您的问题.

Thinbus SRP库是一个JavaScript SRP库,具有对PHP服务器进行身份验证的演示. PHP演示程序不显示使用共享会话密钥,但只要在身份验证协议完成后,浏览器中的服务器和client.getSessionKey()就是$srp-> getSessionKey().默认的Thinbus配置会导致256bit的共享密钥.您可以使用HMAC参见下面的脚注1,了解如何使用签名的JSON.

怎么运行的

注册流程将是:

>客户端API注册表在客户端使用JavaScript生成不传输到服务器的随机API密码.这被保存到浏览器本地存储器中,并向用户显示要求他们将其打印并保留备份.
>密码给予Thinbus SRP客户端JS库代码,该代码输出客户端盐和密码验证器.
>将salt和验证器发布到服务器并保存在该客户端的数据库中.通常,Thinbus建议您使用HTTPS将验证者保留,以将验证者发送到服务器,以防止强力攻击恢复密码.如果您正在使用随机生成的密码,只要是典型的软件许可证密钥,那么您可以通过HTTP传输验证者.见下文脚注2.

API使用流程将从具有产生会话密钥副作用的客户端的SRP认证开始.请注意,所有这些都是在Thinbus演示代码中作为“标准用法”,但这里将说明STP认证如何工作的风格.该认证协议如thinbus page的序列图所示,并在线演示:

>客户端javascript从浏览器本地存储加载API密码.
>客户端AJAX从服务器中提取客户端盐和服务器随机一次数B.
>客户端javascript生成一次性号码A,然后使用密码,salt和两个一次性数字来生成会话密钥K,并使用两次号码进行散列,以创建密码证明M,将其发布到服务器及其随机A.
>服务器使用在注册时保存到数据库的密码验证器,客户端盐和两个随机数来计算会话密钥K,然后确认客户端发送密码证明M是好的.如果这一切都很好,它会向客户端发送自己的证明M2back.此时,客户端已经使用STP作为密码的zero-knowledge proof进行身份验证.
>客户端检查M2的计算.如果一切都好,双方都有一个共享秘密K,这是一个来自随机A和B的一次256位会话密钥,没有中间人可以知道.
>所有API请求和响应都可以通过HMAC与共享密钥签名并在另一方进行验证.

所有上述内容都在Thinbus的PHP演示中被覆盖,实际上调用$srp-> getSessionKey()在结尾有一个可以用于使用HMAC进行签名的键.

让SRP用密码的零知识证明来代替密码认证,这是令人惊讶的,并不是所有的开发人员都默认使用它.事实上,它也生成一个用于API签名的共享会话密钥,这是一个额外的好处.

脚注1:大多数API倾向于将一个JSON值发布到其中的所有数据.这是因为JSON是简单而强大的,内置了PHP和JavaScript中的API,可以将对象转换成字符串并重新启动.由于@dbrumann指出了一个注释,它是一个用于签署JWT的JSON的标准. Google建议这里是PHP和JavaScript两者的库.因此,如果您升级为传递一个JSON输入值,并为API中的每个命令返回一个JSON输出,您可以使用JWT库来签名并验证API的JSON输入和输出.其中一个JWS算法是“JWSAlgorithm.HS256 – 具有SHA-256的HMAC,256位密码”.图书馆将整理实际签名和验证的机制,因此您不必编写该代码并担心可能的安全漏洞.

脚注2:Thinbus的建议是通过HTTPS将密码验证器传输到服务器,以使验证者保密.这是为了防止对密码验证者的离线字典攻击,以恢复密码(即,密码被放入验证者,因此您需要通过验证者生成代码与用户盐运行16G crackstation password dictionary以找到匹配).使用API​​使用浏览器window.crypto API可以生成一个真正随机的“API密钥”.通常,Windows键是16个大写字母显示给格式为XXXX-XXXX-XXXX-XXXX的用户.检查GRC password search space page它说,一个随机的16字母大写密码大小将需要政府14年彻底搜索.鉴于这一估计,您可以安全地传输一个密码验证器,通过普通HTTP无需加密就可以生成这样一个长的随机密码的密码验证器,因为没有人可以通过验证器生成算法(其使用随机的方法)来运行多年的计算能力来运行这么多的密码猜测客户端盐不能预先计算)来找到匹配来恢复客户端API密码.

如何使用公钥和私钥来确保一个小的php api的更多相关文章

  1. HTML5之消息通知的使用(Web Notification)

    通知可以说是web中比较常见且重要的功能,私信、在线提问、或者一些在线即时通讯工具我们总是希望第一时间知道对方有了新的反馈。本篇文章主要介绍了HTML5之消息通知的使用(Web Notification),感兴趣的小伙伴们可以参考一下

  2. ios – 我可以使用哪些iPhone OS API来实现类似于iBook页面翻转过渡的过渡动画?

    >UIKitAPI中的某个地方是否可以使用该动画,还是我必须自己实现?它肯定有3D感觉,他们可以使用OpenGLESAPI吗?解决方法Apple当然使用OpenGLES来实现它.Apple使用的实际API是私有的,但thisblogger具有示例代码的实现的开始.

  3. iOS 7,用于断开调用的私有API CTCallDisconnect不起作用

    谢谢!

  4. 我应该使用哪个高级API来管理iOS上的UDP套接字?

    在“NetworkProgrammingTopicsConceptualGuide”的“UsingSocketsandStreams”一章中,Apple说:Note:POSIXnetworkingdoesnotactivatethecellularradiooniOS.Forthisreason,thePOSIXnetworkingAPIisgenerallydiscouragediniOS.同样

  5. 保护MY REST API仅用于MY IOS APP

    我在Laravel中设计一个RESTAPI,用于我的ios应用程序.目前我被困在以下几点:如何保护我的RESTAPI只允许访问我的ios应用程序?听起来我需要通过向我的IOSAPP授予一个私钥来将类似于HMAC方法的内容合并到我的IOSAPP代码中.当从iosapp中运行请求时,我传递带有私钥和其他数据的哈希,然后当在服务器上收到请求时,我通过重新计算哈希来检测请求是否来自应用程序内的用户.我不知道这是否安全&我会认为不是吗?

  6. ios – 尝试向我们分配IP而不是localhost或home时,NSURLSession失败

    我有一台本地运行的服务器(我的IP是192.168.0.98),并且已经尝试使用一些网络代码来访问它.最初这是通过AFNetworking完成的,但我现在用这样的NSURLSession完成了它:然后我用这3个URL运行它:>http://localhost:8080/api–>作品.>http://127.0.0.1:8080/api–>作品.>http://192.168.0.98:8080/

  7. 适用于iOS的Google云端硬盘实时API

    我想使用GoogleDrive和新的实时API在我的iOS应用中实现实时协作.我知道我可以在Objective-C中设置一个Web视图,并在Web视图和我的本机应用程序之间建立双向通信,因此使用javascript库,但我担心这对于高容量来说效率低下数据流量.我希望可能会有一个原生的解决方案即将出现.有关Objective-C的GoogleApi客户端库是否会更新以包含Google云端硬盘实时API的任何消息?

  8. ios – 如何通过iPhone中的Graph API在Facebook上“喜欢”和“评论”?

    我正在使用图形api显示新闻源.我对以下问题有疑问.>我想为每个新闻提要帖子提供“赞”功能.>我想为每个新闻提要帖子提供“评论”功能.有人可以帮助我如何使用iPhone中的图形API来解决这个问题.解决方法请参考我的答案:HowtocommentorlikeaphotoinfacebookthroughFBconnectorGraphAPIiniPhoneSDK?只需将您的访问令牌发送到https

  9. ios – 使用带有OAuth 2.0的Google API在iPhone中登录Gmail

    我找到了Google提供的服务,可以访问各种Google服务的GoogleApi.我可以在iPhone中设置一个项目,并为iOS应用程序和本机应用程序创建API访问.我想为我的iPhone应用程序使用本机API.它API为我提供了电子邮件,全名,名字,姓氏,google_id,性别,dob,profile_image.如何在我的iPhone应用程序,任何示例应用程序,可用的代码段中使用这些?

  10. ios – 如何使用YouTube API V3?

    我想知道如何在iOS应用中使用新的YouTubeAPI(第3版),但我不知道如何做.我做了很多关于它的研究,但是我发现所有的例子和老API的代码,所以它们是无效的.现在,我明白了,使用新的API你必须在Google开发者控制台中创建一个项目…使用API2很简单它…

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部