代码之家  ›  专栏  ›  技术社区  ›  GetFree

在PHP中实现的简单密码问题

  •  2
  • GetFree  · 技术社区  · 16 年前

    我需要实现几个符合以下要求的函数:

    1. 函数genKey:给定一个字符串q(可能是MD5或SHA哈希)和一个种子字符串,函数必须生成一个新的字符串p

    2. 函数checkKey:如果字符串p是由字符串q生成的(使用前面的函数),则此函数必须返回true

    在seudo代码中,上面的内容是这样的:

    p=genKey(q,seed) ; // generate string p from q and seed 
    
    checkKey(p,q)==true ; // if p was generated from q, then this must return true. False otherwise.
    

    有人知道做这种事情的现有算法吗??

    6 回复  |  直到 16 年前
        1
  •  4
  •   erickson    16 年前

    消息认证码接收消息摘要、秘密和消息。秘密和数据被散列在一起,结果包含在消息中。

    知道秘密的消息接收者可以执行相同的摘要计算,并将他的MAC与接收到的消息附带的MAC进行比较。如果他们是平等的,他可以相信信息没有被改变。


    然而,仍然有一点混乱。通常,私人签名密钥由其所有者保密,在这种情况下,所有者似乎是客户端。客户端可以加密地证明他们拥有与公钥对应的私钥,而无需披露私钥。

    使用数字签名,您可以这样做:

    p = genKey(pvt, seed)
    checkKey(pub, p)
    

    在这里, pvt 是服务器的私钥, pub seed 参数是要签名的数据。如果我理解你的申请(我对此表示怀疑), p 种子 以及它的签名。你的问题令人困惑,因为 q --就像一个共同的秘密。

    p 。使用这种技术,您所能做的就是确保消息内容没有被更改。例如,如果消息类似于“clientID=Alice,IPAddress=192.168.1.1”,则可以确保Mallory没有用自己的IP地址替换Alice的IP地址。

    但是,如果消息只是“clientID=Alice”,你无法阻止Alice向Bob发送防篡改消息(以换取许可证费用的分摊),你也无法控制Mallory是否侵入Alice的盒子并窃取消息。

        2
  •  2
  •   joshperry    16 年前

    对于这个讨论,让p==hash(q)

    然后,您可以轻松地将OpenSSL与php结合使用,用私钥对“p”进行签名,并将该签名与“p”一起保存。

    openssl_sign openssl_verify 有关在php中使用OpenSSL对数据进行签名和验证的信息和示例:

        3
  •  1
  •   Andrew Ensley    16 年前

    $p = genKey($q,rand());
    checkKey($p,$q) == true;
    
    
    function genkey($q,$seed)
    {
        if(array_search($_SESSION['seeds'],$seed) === FALSE)
        {
            $_SESSION['seeds'][] = $seed;
        }
        return hash("sha512", $q . $seed);
    }
    
    function checkKey($p,$q)
    {
        $returnVal = false;
        foreach($_SESSION['seeds'] AS $s)
        {
            if(hash("sha512", $q . $s) == $p)
            {
                $returnVal = true;
                break;
            }
        }
        return $returnVal;
    }
    

        4
  •  1
  •   Calvin    16 年前

    您可以使用 crypt() , hash() ,或 md5() .

    编辑:

    function genKey($q, $seed) {
      // assuming $seed is a properly formatted md5/sha salt
      return crypt($q, $seed);
    }
    
    function checkKey($p, $q, $seed) {
      return ($p == genKey($q, $seed));
    }
    

        5
  •  1
  •   St. John Johnson    16 年前

    好吧,你指的是 公钥加密 ,特别是创建签名。它遵循复杂的数学原理(你必须实现)。

    在基本RSA签名中,您创建签名 s 通过应用以下数学:

    s = m^d % n
    

    是消息(或字符串q), d n 是模数(在私钥和公钥之间共享)。

    然后可以通过以下数学公式进行验证:

     m = s^e % n
    

    哪里

    当然,密钥必须按照特定的数学标准生成才能工作。有时密钥会变得非常大。同样,所有这些都是通过整数完成的,因此您必须将文本转换为十进制并返回。

    this page.

    编辑: 我想我应该提到你为什么要使用公钥密码学。基本上,它可以防止两件事:消息是可验证的,不能伪造。

        6
  •  0
  •   joshperry    16 年前

    检查方是否可以获得种子?如果种子可以在检查端保持安全(就像在web应用程序上一样),你就可以很容易地做一些类似于使用MD5的HTTP摘要式身份验证的事情。

    伪代码:

       function genKey(q) {
          p = md5sum(q . ':' . seed);
          return p;
       }
    
       function checkKey(p,q) {
          return md5sum(q . ':' . seed) == p;
       }
    

    如果你需要第二方来验证“签名”,那么你可能只想使用PKI。