2013-07-18 1 views
0

Я пытался повторить технологический процесс, представленный на этом блоге в OpenSSL: http://farid.hajji.name/blog/2009/07/27/public-key-cryptography-with-openssl/OpenSSL Ошибка аутентификации dgst

Однако, проверка подлинности, кажется, не в состоянии, несмотря на множество вариаций. Что случилось? См. Код ниже, который вы можете скопировать и вставить в OpenSSL. Обратите внимание, что я использую скомпилированную двоичную версию Windows OpenSSL.

//================Phase 1 - Setup================ 

//Generate my private key (myprivatekey.txt) 
genpkey -algorithm RSA -out C:\myprivatekey.txt -pass pass:abc123 -pkeyopt rsa_keygen_bits:2048 

//Generate friend's private key (friendprivatekey.txt) 
genpkey -algorithm RSA -out C:\friendprivatekey.txt -pass pass:123abc -pkeyopt rsa_keygen_bits:2048 

---------------- 

//Extract my public key (mypublickey.txt) from my private key (myprivatekey.txt) 
rsa -passin pass:abc123 -in C:\myprivatekey.txt -pubout -out C:\mypublickey.txt 

//Extract friend's public key (friendpublickey.txt) from my private key (friendprivatekey.txt) 
rsa -passin pass:123abc -in C:\friendprivatekey.txt -pubout -out C:\friendpublickey.txt 

---------------- 

//Generate my password (a random base64 string password saved mypassword.txt) 
rand -base64 -out C:\mypassword.txt 128 

//Generate friend's password (a random base64 string password saved to friendpassword.txt) 
rand -base64 -out C:\friendpassword.txt 128 

//Delete the .rnd file that's generated? Not sure what it is. 

---------------- 

//Encrypt my password using my private key (encrypted password saved to a binary file - myencryptedpassword.txt) 
pkeyutl -in C:\mypassword.txt -out C:\myencryptedpassword.txt -inkey C:\myprivatekey.txt -passin pass:abc123 

//Encrypt friend's password using friend's private key (encrypted password saved to a binary file - friendencryptedpassword.txt) 
pkeyutl -in C:\friendpassword.txt -out C:\friendencryptedpassword.txt -inkey C:\friendprivatekey.txt -passin pass:123abc 

---------------- 

//Convert my encrypted password to base64 from binary (saved as myencryptedpasswordbase64.txt) 
base64 -in C:\myencryptedpassword.txt -out C:\myencryptedpasswordbase64.txt 

//Convert friend's encrypted password to base64 from binary (saved as friendencryptedpasswordbase64.txt) 
base64 -in C:\friendencryptedpassword.txt -out C:\friendencryptedpasswordbase64.txt 

---------------- 

//Create a signed hash of my password so my friend knows it's coming from me (signed hash saved as mysignedhash.txt and is in binary form) 
dgst -sha256 -sign C:\myprivatekey.txt -passin pass:abc123 -out C:\mysignedhash.txt C:\myencryptedpasswordbase64.txt 

//Create a signed hash of friend's password so I know it's coming from my friend (signed hash saved as friendsignedhash.txt and is in binary form) 
dgst -sha256 -sign C:\friendprivatekey.txt -passin pass:123abc -out C:\friendsignedhash.txt C:\friendencryptedpasswordbase64.txt 

---------------- 

//Convert my signed hash from binary to base64 
base64 -in C:\mysignedhash.txt -out C:\mysignedhashbase64.txt 

//Convert friend's signed hash from binary to base64 
base64 -in C:\friendsignedhash.txt -out C:\friendsignedhashbase64.txt 

//================Phase 2 - Authentication================ 

//Now, we reverse the process and authenticate the friend. Let's prefix all output files with "phase2" 

//I provide friend with my public key and my encrypted password 
//Friend provides me with their public key 

//Convert friend's encrypted password from base64 to binary. The output file will be the same as friendsignedhash.txt 
base64 -d -in C:\friendsignedhashbase64.txt -out C:\phase2friendsignedhash.txt 

//Convert friend's signed hash from base64 to binary. The output file will be the same as C:\friendsignedhash.txt 
base64 -d -in C:\friendencryptedpasswordbase64.txt -out C:\phase2friendencryptedpassword.txt 

//Verify if the password originates from my friend (by checking against my friend's public key) 
dgst -sha256 -verify C:\friendpublickey.txt -signature C:\phase2friendsignedhash.txt -out C:\friendresult.txt C:\phase2friendencryptedpassword.txt 

Любая идея, почему происходит сбой проверки?

+0

Я проголосовал за закрытие как «вне темы». Это вопрос о программном инструменте, а не о проблеме программирования. Вы можете попробовать http://security.stackexchange.com. –

+0

Вы посмотрели, сколько сообщений OpenSSL находится в StackOverflow? http://stackoverflow.com/search?q=openssl Это обычно используемый инструмент, да, но он используется в программировании. В этом вопросе мы программируем скрипт, используя этот инструмент для достижения желаемого результата. – user2520041

ответ

0

Проблема в том, что вы подписали friendencryptedpasswordbase64.txt, но пытаетесь проверить с помощью phase2friendencryptedpassword.txt (non-base64). Если вы проверите с первым, он отлично работает!

В дополнение к этому я вижу пару проблем, связанных с безопасностью. Они не вызывают проблемы, о которых вы просили, но они идут вразрез с хорошей практикой безопасности.

Во-первых, вы, вероятно, захотите зашифровать свой пароль открытым ключом своего друга, а не своим личным ключом. Тогда только секретный ключ вашего друга сможет расшифровать его. В противном случае любой с вашим открытым ключом может расшифровать ваш зашифрованный пароль.

Во-вторых, как правило, вы не хотите использовать один и тот же ключ для нескольких целей (то есть подписи и шифрования). Use a separate key for each function.

+1

Спасибо. Более подробное обсуждение можно найти здесь с рабочей редакцией: http://security.stackexchange.com/questions/39133/openssl-dgst-authentication-failure/39193#39193 – user2520041