AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1553429
Accepted
VladoDemcak
VladoDemcak
Asked: 2020-05-20 22:52:25 +0800 CST2020-05-20 22:52:25 +0800 CST 2020-05-20 22:52:25 +0800 CST

使用 openssl pkeyutl 签名的 Openssl 使用 openssl dgst 验证

  • 772

我想用 签名哈希openssl pkeyutl并用 验证openssl dgst -verify。

下面是我测试的私钥和公钥(EC 密钥):

私人.pem:

-----BEGIN EC PARAMETERS-----
BggqhkjOPQMBBw==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIFYL7prqjwKcVpKp4VF0kSshVoNCu3QzFeJHjvq78n4FoAoGCCqGSM49
AwEHoUQDQgAEkcL/M+0hEuW/VUNCZT5Jc1pyw9gm4vphWldTdAqMJhC8eTiP/gao
rTkz6+iFfOPbJTEzRD8y36WqYAlS+65W8A==
-----END EC PRIVATE KEY-----

公共.pem:

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkcL/M+0hEuW/VUNCZT5Jc1pyw9gm
4vphWldTdAqMJhC8eTiP/gaorTkz6+iFfOPbJTEzRD8y36WqYAlS+65W8A==
-----END PUBLIC KEY-----
$ echo -n "123456" | openssl dgst -sha256 
8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

S̶H̶A̶-̶2̶4̶5̶ 123456 的 SHA-246 是8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92.

让我们用 pkeyutl 签署 SHA256(123456)

$ echo -n "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92" | openssl pkeyutl -inkey private.pem -sign | openssl base64 -e -A
MEYCIQDIJHf2SQJliMNvPwgCqanzqWxleK/YGSCd15RK8IYPEQIhAOlcvXH9ASQRMRNgKgMr4ZZLL3nyaCsTHBeU0iReZMmp

所以我们有base64编码的签名MEYCIQDIJHf2SQJliMNvPwgCqanzqWxleK/YGSCd15RK8IYPEQIhAOlcvXH9ASQRMRNgKgMr4ZZLL3nyaCsTHBeU0iReZMmp

现在让我们验证openssl pkeyutl -verify

$ openssl pkeyutl -verify -pubin -inkey public.pem  -sigfile <(echo -n "MEYCIQDIJHf2SQJliMNvPwgCqanzqWxleK/YGSCd15RK8IYPEQIhAOlcvXH9ASQRMRNgKgMr4ZZLL3nyaCsTHBeU0iReZMmp" | openssl enc -A -base64 -d ) -in <(echo -n "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92")
Signature Verified Successfully

所以已经验证成功。

现在是有问题的部分:所以我们要签名的原始数据是“123456”。让我们用openssl dgst这个:

$ echo -n "123456" | openssl dgst -sha256 -verify public.pem -signature <(echo -n "MEYCIQDIJHf2SQJliMNvPwgCqanzqWxleK/YGSCd15RK8IYPEQIhAOlcvXH9ASQRMRNgKgMr4ZZLL3nyaCsTHBeU0iReZMmp" | openssl enc -A -base64 -d)
Verification Failure

返回验证失败。

从原始“123456”文本创建 sha256 摘要时是否openssl dgst做其他事情?

据我了解,它应该可以工作,因为pkeyutl签名的sha256哈希值与通过openssl dgst -sha256. 在这里,我们使用相同的私钥和公钥,所以我不明白为什么openssl dgst -verify无法验证通过生成的签名pkeyutl,

openssl signature
  • 1 1 个回答
  • 889 Views

1 个回答

  • Voted
  1. Best Answer
    dave_thompson_085
    2020-05-21T16:24:02+08:002020-05-21T16:24:02+08:00

    TLDR:这是十六进制

    SHA-245 [你的意思是 SHA-256] 的 123456 是 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

    并不真地。我们经常把这种事情说成是一种捷径或约定,但你似乎误解了它。是以十六进制显示8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92的 SHA-256,意思是 base-16,我们通常缩写为十六进制,或者我们也称其为“编码为”或“表示为”十六进制。实际的哈希值是 32 字节的任意位,这些位不构成字符,因此无法正确显示、发布到 Stack 或以其他方式被人类使用;这就是为什么我们几乎总是使用 hex 或 base64 来处理程序和文件之外的此类数据。(更准确地说,哈希是256 位,在使用 8 位字节的系统或设备上只有 32字节123456 -- 不是所有的都可以,但是你作为普通用户遇到的所有的都是这样。特别是,OpenSSL 工作的所有设备都使用 8 位字节,因此OpenSSL SHA-256 是 32 字节。)

    您需要将十六进制表示形式转换回实际数据——在 Unix 上有几个选项在这里被众多 Q 或 serverfault 或 unix.SX 覆盖,但在 Windows 上较少(在 WSL 之外,实际上是 Unix)——或使用dgst -binarywhich 不首先创建十六进制表示,因此更简单:

    $ echo -n 123456 |openssl sha256 -binary |tee hash |od -tx1
    0000000 8d 96 9e ef 6e ca d3 c2 9a 3a 62 92 80 e6 86 cf
    0000020 0c 3f 5d 5a 86 af f3 ca 12 02 0c 92 3a dc 6c 92
    0000040
    $ openssl pkeyutl -sign -inkey private -in hash |openssl base64 -e -A |tee sig
    MEUCIQCxK8aJ195ihqV/XJtwESXnpD7lQX47uppM8SD/JMehiAIgKDqNXvPfvC7SqbSJ3yBaqt3mJ+GIHD9sDP1YGBh9shA=
    $ openssl pkeyutl -verify -pubin -inkey public -in hash -sigfile <( openssl base64 -d -A <sig )
    Signature Verified Successfully
    $ echo -n 123456 |openssl sha256 -verify public -signature <( openssl base64 -d -A <sig )
    Verified OK
    $
    

    PS:注意不是所有版本都echo支持-n;见https://unix.stackexchange.com/questions/65803/why-is-printf-better-than-echo

    • 1

相关问题

  • OpenSSL 支持 ed25519,加密内容?

  • 如何验证 SSL 证书文件是否与密钥文件匹配?

  • 使用 openssl 生成 JWT RS256 签名

  • 加载密钥“ec256.pem”:尝试从私钥生成公钥时抛出无效格式

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve