我正在尝试开发一个网站和相应的帮助程序(安装在用户计算机上)。网站和程序将相互通信(主要是AJAX),但如果任何其他网页可以向程序发送请求,则存在很大的安全风险。我想提出一个解决方案,这使得向我的程序(安装在用户计算机上)注入欺诈请求非常困难。我的想法是使用一次性密码,但我的安全知识有限,因此请问你的想法。
我想出了这种一次性密码算法(伪):
function otp(seed, counter, unix_timestamp, action)
{
for(i = 0; i < counter; ++i)
{
seed = sha256(seed + i);
}
str = seed;
str = sha256(str + unix_timestamp/60);
str = sha256(str + action);
otp = substr(str,0,4); //Convert the first for bytes to an int.
return (int)otp;
}
它应具有以下属性:
如果每个请求都包含OTP代码和计数器值,这是否安全?如果没有,你有什么建议来完成这个?我真的想要上面提到的那些属性。
提前致谢。
答案 0 :(得分:6)
原则上你的方法是明智的。但请记住,对哈希函数的多次调用毫无意义 - 要么在第一次传递时是安全的,要么根本不是。 此外,您现在只使用种子来实际验证请求(潜在的攻击者会知道其他任何事情),种子生成中的任何弱点都会成为身份验证的弱点。
我不知道SHA256的具体缺点。但是,您的问题通常很常见,并且更容易用标准术语来描述和解决。您想验证对程序的请求。您的远程程序需要安全地确定请求的真实性。使用公钥加密最容易解决这个问题。例如,创建一个GnuPG密钥对,将私钥保存在您的网站上并使用您的程序分发公钥,并使用私钥对您发送到程序的任何命令进行签名。客户端程序正常接收请求,只需要通过一次调用GnuPG来验证其真实性。
答案 1 :(得分:4)