2015-06-26 17 views
8

Tôi đang cố gắng tìm ra kịch bản lệnh shell tương đương của một tập lệnh ruby ​​nhỏ mà tôi có. Đây là tập lệnh ruby:OpenSSL RSA ký với SHA256 digest

require 'openssl' 
require 'base64' 

k = OpenSSL::PKey::RSA.new(File.read("key.pem")) 
res = File.read("res.tmp") 
digest = OpenSSL::Digest::SHA256.new 
signature = k.sign(digest,res) 
File.write("foo1.txt",Base64.strict_encode64(signature)) 

Vậy đó. Phải mất một số dữ liệu, được băm SHA256 của nó, và sau đó dấu hiệu rằng với một khóa riêng tôi có. Tôi nghĩ rằng lệnh tương đương trên thiết bị đầu cuối phải là:

openssl sha -sha256 -sign key.pem < res.tmp | base64 -w 0 > foo2.txt 

Nhưng chúng không tạo ra cùng một đầu ra. Ai có thể khai sáng cho tôi về lý do tại sao?

- EDIT -

tôi thêm một số thông tin để mọi người có thể cố gắng tái tạo này trên máy tính của họ nếu muốn. Nội dung của res.tmp là:

This is some sample text. 
This is some sample text. 
This is some sample text. 
This is some more sample text. 
This is some more sample text. 
This is some more sample text. 

các khóa riêng (đó là không một khóa bí mật được thực tế sử dụng cho bất kỳ hệ thống sản xuất, chỉ cần làm rõ đó) là:

-----BEGIN PRIVATE KEY----- 
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALNY2EtJTj78tvnL 
G1v+5HFqn8mZ85AToUqj/n86/eymcMqEjskHAoVmU9FOr+ZsnSxopNvUVLCzDkv6 
w88tUtHGblzFtzJpQrxvtH8VCd2BNUc6Esxx7lmQeCxJMMPnmY2ZkDZuH6L+UsVL 
DbM7LCvJyluo/A3AP68G9YL+XTjFAgMBAAECgYBkJzsyX894UTwFJq0ypJcB1x9A 
P97KGIw72HTorBLdMt1N2tS54lZAFLK98gk8zm6/O/jEYkChJHzZZUIv0gmq+HOG 
CHLyBNsf3BzmBXmwLRIOf54MxwaafysjpHifuYB4Po7G/utvlYqIxg1mBo/KtnMC 
Wl2Enmrunei6gN3SAQJBAN94UfraP7lG50OYWhkcso95xpGrCeoFT64dV9I56FhU 
q4tD6SSeIXj50hvSH2MQMdFBjsUHPIt+X7zw17ywgwUCQQDNdETg4FD3YT1xolWD 
IFEowLlKfNqSaDIQia0dMIzk1/IqOoYhRKH03A97Wae1w/iyMgefyOVvkk+FZUs7 
r0rBAkAnZox1wTNJFIJD/cGs+c1V1K+5EUIPO95/oXbRfxpDMLKKPHAH38WhEdME 
yrhz++/8qCVnAc6f/akdpA01nJ2NAkEArC1GE9aow8fgADz0wMDygt6P6ZacbZmY 
azeVtiKb0KQQM8d75KFpwJQy/UJzQ+aJonw+2282p7vLnJT46XnLgQJALxzSBu0D 
hXIDTAMBpon+zgXjiy0ndiigLDPh1jJyCXrH0tBwj3FN+Br3yxbZT2LmE6PLIaJy 
rkTCKqlnkG2h+w== 
-----END PRIVATE KEY----- 

Bây giờ, bất cứ ai sẽ có thể chạy các lệnh mà tôi đã cung cấp ở trên và nhận được kết quả tương tự. Kịch bản lệnh shell tạo ra điều này làm đầu ra của nó:

l4BxJyo/GQ0vUF5YR/vO7NtX5Sn/9bGfNHiVGS+W1CMfrwVlCtT0afHERXowx5T8mOiZ90VCJioHMj9Z6ssmfF1SpUbpoo1HYwNBCAfEcIjPLBj4N4KDLpy4gbMZtHEo2B8DZitYLwYDyvkCEudrMiU9b39DqOL+p3pwjJxT5iE= 

Không có dòng mới của khóa học. Tập lệnh ruby ​​sản xuất:

l4BxJyo/GQ0vUF5YR/vO7NtX5Sn/9bGfNHiVGS+W1CMfrwVlCtT0afHERXowx5T8mOiZ90VCJioHMj9Z6ssmfF1SpUbpoo1HYwNBCAfEcIjPLBj4N4KDLpy4gbMZtHEo2B8DZitYLwYDyvkCEudrMiU9b39DqOL+p3pwjJxT5iE= 

Cũng không có dấu dòng mới. Tôi chỉ có cơ sở 64 mã hóa các kết quả để làm cho chúng có thể biểu lộ cho con người. Phần đó không phải là vấn đề. Vấn đề thực sự là lời gọi của tôi về openssl trong kịch bản lệnh ruby ​​và kịch bản lệnh shell đang làm những việc khác nhau. Trong các ý kiến, mọi người cứ hỏi về kết quả trung gian. Chỉ cần được rõ ràng, điều duy nhất có thể được coi là một "kết quả trung gian" trong kết quả nhị phân nguyên trước khi mã hóa base64 (và nó sẽ được cả hai vô ích và không thể cho tôi để gửi rằng ở đây). Lệnh openssl tôi đang chạy chỉ là một lệnh mờ (trong cả hai kịch bản lệnh), vì vậy tôi không có quyền truy cập vào hàm băm SHA256 trong cả hai trường hợp. Tôi cho rằng nó sẽ được tạo ra với lệnh này:

sha256sum res.tmp 

Mà cho này tại cửa sổ dòng lệnh:

688a84cb84ce3b203460a2775248a31d4c3e9590a41ba27134dc342c328b8f9c res.tmp 

Nhưng tôi không thể chắc chắn rằng các hash trên thực tế là bất kỳ kết quả trung gian của một trong hai hai kịch bản. Hãy cho tôi biết nếu tôi có thể cung cấp thêm thông tin. Cảm ơn.

+0

Bạn có nhận được kết quả tương tự từ tập lệnh ruby ​​mỗi lần không? Bạn có nhận được cùng một kết quả trung gian từ tập lệnh ruby ​​và lệnh openssl không? Bạn đang sử dụng phiên bản openssl nào? –

+0

@EtanReisner Có. Cả hai kịch bản đều hoàn toàn xác định. Cả hai đều cho kết quả tương tự mỗi khi chúng được chạy. "Kết quả trung gian" (nếu bạn có nghĩa là dữ liệu nhị phân thô trước khi nó được mã hóa base64) cũng giống nhau mỗi lần. Tôi không biết phiên bản openssl nào trên máy tính đang chạy các lệnh này, nhưng nó chỉ là phiên bản trong repo quetzal lượng tử ubuntu. –

+0

Bước trung gian có giống nhau giữa hai tập lệnh không?(Đó là bước mà gây ra đầu ra khác nhau.) –

Trả lời

0

Bằng cách nào đó, tôi đã nhầm lẫn và dường như hai tập lệnh này thực sự tạo ra cùng một đầu ra. Lấy làm tiếc.

+0

Với hoàn cảnh tôi không nghĩ rằng câu hỏi là rất hữu ích nữa, sau đó ;-) –

+0

Điều đó đúng . Nếu ai đó muốn đóng hoặc xóa nó, tôi sẽ ổn với điều đó. –

Các vấn đề liên quan