我正在研究我正在开发的网站的用户身份验证协议.我想创建一个身份验证cookie,以便用户可以在页面之间保持登录状态.
这是我的第一个bash:
cookie = user_id|expiry_date|HMAC(user_id|expiry_date, k)
Run Code Online (Sandbox Code Playgroud)
其中k是,HMAC(user_id|expiry_date, sk)而sk是仅为服务器所知的256位密钥.HMAC是SHA-256哈希.注意'|' 是一个分隔符,而不仅仅是连接.
在PHP中看起来像这样:
$key = hash_hmac('sha256', $user_id . '|' . $expiry_time, SECRET_KEY);
$digest = hash_hmac('sha256', $user_id . '|' . $expiry_time, $key);
$cookie = $user_id . '|' . $expiry_time . '|' . $digest;
Run Code Online (Sandbox Code Playgroud)
我可以看到它很容易受到安全Cookie协议中规定的重播攻击,但应该能够抵御卷攻击和加密拼接.
问题: 我在这里是否正确,或者是否存在我错过的巨大漏洞?有没有办法防御与动态分配的IP地址一起使用且不使用会话的重播攻击?
笔记
我读过的最新资料:
网上客户认证的注意事项,
也就是Fu等人.
(https://pdos.csail.mit.edu/papers/webauth:sec10.pdf)
安全Cookie协议
又名刘等人.
(http://www.cse.msu.edu/~alexliu/publications/Cookie/cookie.pdf)
扩展了以前的方法
强化无状态会话Cookie
(http://www.lightbluetouchpaper.org/2008/05/16/hardened-stateless-session-cookies/)
,它也扩展了以前的方法.
由于主题非常复杂,我只是在寻找具有创建和破坏身份验证方案的真实经验的安全专家的答案.
在iPhone(服务器)上,我试图发布一个服务,我的代码遇到了NSNetService对象的委托方法:
-(void)netServiceDidPublish:(NSNetService *)sender
Run Code Online (Sandbox Code Playgroud)
所以我相信我的服务@"_chatty._tcp."已成功发布.然后在另一个iPhone(客户端)上,我NSNetServiceBrowser用来查找我的服务,但它没有遇到委托方法:
-(void)netServiceBrowser:(NSNetServiceBrowser *)netServiceBrowser didFindService:(NSNetService *)netService moreComing:(BOOL)moreServicesComing
Run Code Online (Sandbox Code Playgroud)
我在这个网站上发现了一些与我的案例有关的问题,大多数答案提醒检查委托对象是否超出范围.我确信我的代表工作得很好,因为它遇到了另一个委托方法,如:
-(void)netServiceBrowserWillSearch:(NSNetServiceBrowser *)aNetServiceBrowser
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我找出原因吗?
以下是我的代码的一些部分:
我这样启动服务:
#define MY_PROTOCOL @"_chatty._tcp."
self.myService = [[NSNetService alloc]
initWithDomain:@"" type:MY_PROTOCOL
name:@"thaith" port:self.port];
Run Code Online (Sandbox Code Playgroud)
使用Browser类中的给定listenSocket初始化端口:
NSNetServiceBrowser* finder = [[NSNetServiceBrowser alloc] init];
//I also retain the finder.
finder.delegate = self;
[finder searchForServicesOfType:MY_PROTOCOL inDomain:@""];
Run Code Online (Sandbox Code Playgroud) 在objectiveC中给出一个包含字符串的NSArray fred,我可以说:
NSString *s = [fred ObjectAtIndex:5];
Run Code Online (Sandbox Code Playgroud)
什么是c#等价物?罗塞塔石头说要使用这种方法ValueAt但是会返回一个IntPtr.
var i = fred.ValueAt(5);
Run Code Online (Sandbox Code Playgroud)
但是你剩下的就是如何将一个转换IntPtr为NSString指针.