Как я могу проверить pem_cert и подпись (RSA-SHA1)? - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь проверить действительность подписи, в Node.js я бы использовал

https://nodejs.org/api/crypto.html#crypto_verify_verify_object_signature_signatureencoding

Кажется, я не могу найти ничего для кристалла, обеспечивающего эту функциональность?

1 Ответ

2 голосов
/ 25 марта 2019

В настоящее время это не реализовано в стандартной библиотеке, но мы можем найти осколок, который это делает: openssl_ext .Этот осколок очень похож на Ruby API, так что давайте начнем!

Сначала нам нужен ключ:

$ openssl genpkey -algorithm rsa -out key.pem
$ openssl rsa -in key.pem -pubout -out pub.pem

Затем нам нужно создать осколок и добавить зависимость:

$ shards init
$ $EDITOR shards.yml
dependencies:
   openssl_ext:
      github: randomstate/openssl_ext
$ shards

Небольшая программа для подписи чего-либо:

$ $EDITOR sign.cr
require "openssl_ext"
require "base64"

private_key = OpenSSL::RSA.new File.read(ARGV[0])
digest = OpenSSL::Digest.new("SHA1")

data = ARGV[1]
signature = private_key.sign digest, data

puts Base64.encode signature
$ crystal build sign.cr

И небольшая программа для проверки подписи:

$ $EDITOR verify.cr
require "openssl_ext"
require "base64"

public_key = OpenSSL::RSA.new File.read(ARGV[0]), is_private: false
digest = OpenSSL::Digest.new("SHA1")

data = ARGV[1]
signature = Base64.decode STDIN.gets_to_end

puts public_key.verify(digest, signature, data) ? "Valid" : "Invalid"
$ crystal build verify.cr

Давайте проверим нашу работу:

$ ./sign key.pem Hello | ./verify pub.pem Hello
Valid
$ ./sign key.pem Hello | ./verify pub.pem Bye
Invalid
...