如何获取公钥的指纹?

时间:2019-05-24 15:47:28

标签: php openssl php-openssl

在PHP中,我有一个公共密钥(已经作为OpenSSL资源)。我想计算公钥指纹(SHA1或其他哈希)。

我该怎么做?

PHP版本为7.2或更早版本。

编辑:这不是另一个问题的重复,因为该问题与使用SSH(及相关)命令的SSH密钥有关。我想使用PHP和PHP扩展名openssl做同样的事情。

2 个答案:

答案 0 :(得分:0)

如果您需要哈希php,可以使用多种哈希函数:

sha1()-https://php.net/manual/en/function.sha1.php

md5()-https://www.php.net/manual/en/function.md5.php

或如果需要更具体的算法,请使用hash()-see the docs

答案 1 :(得分:0)

我自己找到了解决方案。基本思路:

  1. 以PEM格式解码密钥的base64编码部分(从中删除空格后)
  2. 散列结果二进制数据。

在代码(PHP)中:

function getPublicKeyFingerprint(string $pemEncodedKey, string $hashAlgorithm = 'sha1')
{
    $keyWithoutPemWrapper = \preg_replace(
        '/^-----BEGIN (?:[A-Z]+ )?PUBLIC KEY-----([A-Za-z0-9\\/\\+\\s=]+)-----END (?:[A-Z]+ )?PUBLIC KEY-----$/ms',
        '\\1',
        $pemEncodedKey
    );
    $keyDataWithoutSpaces = \preg_replace('/\\s+/', '', $keyWithoutPemWrapper);

    $binaryKey = \base64_decode($keyDataWithoutSpaces);

    return \hash($hashAlgorithm, $binaryKey);
}