:: Visual Foxpro, Foxpro for DOS
Шифрование данных
bell
Автор

Сообщений: 167
Откуда: Харьков
Дата регистрации: 04.04.2002
Я тут задавал пару вопросов по поводу шифрования данных с помощью класса _cryptapi:
forum.foxclub.ru
forum.foxclub.ru
К сожалению, на второй вопрос ответов так и не дождался. Может быть, мало кто юзает класс _cryptapi?
Поделитесь, пожалуйста, кто как шифрует пароли и прочие данные.




------------------
Ratings: 0 negative/0 positive
Re: Шифрование данных
TAS

Сообщений: 851
Откуда: Москва
Дата регистрации: 28.09.2000
На твои вопросы могут ответить разработчики - они регулярно проводят семинары, правда стоит это дорого

Можно попробовать шифровать следующим образом:

capicom.h

*Константы для Algorithm.Name
#define CAPICOM_ENCRYPTION_ALGORITHM_RC2 0 && Use RSA RC2 encryption.
#define CAPICOM_ENCRYPTION_ALGORITHM_RC4 1 && Use RSA RC4 encryption.
#define CAPICOM_ENCRYPTION_ALGORITHM_DES 2 && Use DES encryption.
#define CAPICOM_ENCRYPTION_ALGORITHM_3DES 3 && Use triple DES encryption.
#define CAPICOM_ENCRYPTION_ALGORITHM_AES 4 && Use AES algorithm. (CAPICOM v2.0)
*Константы для Algorithm.KeyLength
#define CAPICOM_ENCRYPTION_KEY_LENGTH_MAXIMUM 0
#define CAPICOM_ENCRYPTION_KEY_LENGTH_40_BITS 1
#define CAPICOM_ENCRYPTION_KEY_LENGTH_56_BITS 2
#define CAPICOM_ENCRYPTION_KEY_LENGTH_128_BITS 3
#define CAPICOM_ENCRYPTION_KEY_LENGTH_192_BITS 4 && (CAPICOM v2.0)
#define CAPICOM_ENCRYPTION_KEY_LENGTH_256_BITS 5 && (CAPICOM v2.0)

программа:

#include CapiCom.h
* Шифровка данных --------------------------------------------------------------------------
oCAPI = CREATEOBJECT('CAPICOM.EncryptedData')
oCAPI.Algorithm.Name = CAPICOM_ENCRYPTION_ALGORITHM_RC4
oCAPI.Algorithm.KeyLength = CAPICOM_ENCRYPTION_KEY_LENGTH_MAXIMUM
oCAPI.Content = "Test Data for encrypting и с русскими БУКВАМИ!"
oCAPI.setsecret("MyPassword")
cEncData = oCAPI.encrypt()
release oCAPI
? cEncData
* Дешифровка данных ------------------------------------------------------------------------
*
oCAPI = CREATEOBJECT('CAPICOM.EncryptedData')
oCAPI.setsecret("MyPassword")
oCAPI.decrypt(cEncData)
? oCAPI.Content
release oCAPI

Полная бесплатность гарантируется . Однако я не владею информацией о совместимости алгоритмов на разных версиях виндов, однако думаю что сдесь использовался принцип обратной совместимости: что есть в 98, то будет и в XP отрабатываться правильно.
Ratings: 0 negative/0 positive
Re: Шифрование данных
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Еще там есть прикольная функция шифрования
forum.foxclub.ru




------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: Шифрование данных
Shardim

Сообщений: 166
Дата регистрации: 15.10.2003
Смотря, как ты хочешь шифровать с помощью сертификатов или без них. В любом случае рекомендую всетаки использовать CryptoAPI, а не надстройки над ним. Получется сложнее, но делай чего хочеш. Лично я написал под свои нужды небольшую DLL.
Ratings: 0 negative/0 positive
Re: Шифрование данных
bell
Автор

Сообщений: 167
Откуда: Харьков
Дата регистрации: 04.04.2002
2 Shardim
Я бы использовал CryptoAPI, но у меня проблема, которую я изложил здесь:
forum.foxclub.ru
Шифрую на машине под Win98, а расшифровать на другой под WinXP не могу. У тебя такого не случалось?
Ratings: 0 negative/0 positive
Re: Шифрование данных
bell
Автор

Сообщений: 167
Откуда: Харьков
Дата регистрации: 04.04.2002
2 piva
Спасибо за ссылку на твою прикольную функцию. Я ее уже и сам нашел.
Склоняюсь к тому, чтобы использовать ее и отказаться от CryptoAPI.
Ratings: 0 negative/0 positive
Re: Шифрование данных
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Пробовал пример с CAPICOM заметна длина шифрованной части - только хвост меняется




------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: Шифрование данных
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi bell!

Явно нужно задавать и тип крипто-провайдера, и алгоритм, и используемую длину ключа... Ориентируясь конечно именно на "Base ..." провейдера, т.к. в Win98 другого обычно нету.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Шифрование данных
bell
Автор

Сообщений: 167
Откуда: Харьков
Дата регистрации: 04.04.2002
Hi Igor!

Решил все-таки проверить твое предложение, но не понял, как явно задать тип крипто-провайдера, алгоритм, используемую длину ключа? Судя по коду класса _cryptapi, все это "Defined in WinCrypt.h", то есть после Build будет зашито в exe!
Ratings: 0 negative/0 positive
Re: Шифрование данных
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi bell!

Приведи пример кода, работающего не так как требуется в разных ОС, а то там много чего понакручено в crypt.vcx




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Шифрование данных
bell
Автор

Сообщений: 167
Откуда: Харьков
Дата регистрации: 04.04.2002
Hi Igor!

Код шифрования:
LOCAL lcEncryptedStream, lcPassWord, lcKey
lcEncryptedStream = ''
lcPassWord = THISFORM.txtPass.Value
lcKey = 'abc12345'
IF !THISFORM._cryptapi1.EncryptSessionStreamString(lcPassWord, lcKey, @lcEncryptedStream)
MESSAGEBOX('Error: '+ ...)
ENDIF
SELECT v_users
REPLACE cPassword WITH lcEncryptedStream
Код дешифрования:
LOCAL lcDecryptedStream, lcPassWord, lcKey
lcDecryptedStream = ''
lcPassWord = THISFORM.txtPass.Value
lcKey = 'abc12345'
IF !THISFORM._cryptapi1.DecryptSessionStreamString(lcPassWord, lcKey, @lcDecryptedStream)
MESSAGEBOX('Error: '+ ...)
ENDIF
IF lcDecryptedStream # v_users.cPassword
MESSAGEBOX('Неверный пароль.', ...)
THISFORM.txtPass.SetFocus
RETURN
ENDIF
Свойства:
_cryptapi1.cProviderName = "Microsoft Base Cryptographic Provider v1.0"
txtPass.MaxLength = 10
txtPass.PasswordChar = '*'
Ratings: 0 negative/0 positive
Re: Шифрование данных
bell
Автор

Сообщений: 167
Откуда: Харьков
Дата регистрации: 04.04.2002
Ну, вот посмотрел на свой код и все понял. Конечно, для проверки введенного пароля мне нужно его не дешифровать, а опять зашифровать и сравнить с предварительно зашифрованным и сохраненным в v_users.cPassword.

Правильный код "дешифрования":
LOCAL lcEncryptedStream, lcPassWord, lcKey
lcEncryptedStream = ''
lcPassWord = THISFORM.txtPass.Value
lcKey = 'abc12345'
IF !THISFORM._cryptapi1.EncryptSessionStreamString(lcPassWord, lcKey, @lcEncryptedStream)
MESSAGEBOX('Error: '+ ...)
ENDIF
IF lcEncryptedStream # v_users.cPassword
MESSAGEBOX('Неверный пароль.', ...)
THISFORM.txtPass.SetFocus
RETURN
ENDIF
Игорь, спасибо, что обратил внимание на код. ALL, извините, что морочил голову.
Непонятно только, как это работало на машинах с Win98 и WinME, а сказалось на машине с WinXP.



Отредактировано (12.04.05 19:03)


------------------
Ratings: 0 negative/0 positive
Re: Шифрование данных
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi bell!

Ну слава богу, а то я уж запланировал Win98 дома реанимировать

Кстати ты бы сразу сказал что тебе нужно пароли хранить - есть способ проще (и IMHO лучше) - не шифровать пароль, а хранить его хэш - например MD5 - во-первых подобрать по хэшу пароль весьма сложно (есть правда один сайтик где ломают MD5 хеши - ну и там до пары суток могут трудится, а хеши есть и по другим алгоритмам посчитанные . Во-вторых код получения хеша достаточно прост, и наконец хеш всегда занимает фиксированное число байт - т.е. сам пароль можно разрешить вводить хоть на 5 страниц мелким почерком - MD5 в любом случае будет размером 128 бит (16 байт если НЕ переводить в "читабельный" вид (поле типа С(16) NOCPTRANS) и 32 байта если в виде HEX строки хранить)...




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Шифрование данных
bell
Автор

Сообщений: 167
Откуда: Харьков
Дата регистрации: 04.04.2002
Hi Igor!

Сразу бы и привел код получения хеша или дал ссылку.
Ratings: 0 negative/0 positive
Re: Шифрование данных
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi bell!

Сделав поиск по MD5 можно получить ответ гораздо быстрее, чем ожидая тут...
forum.foxclub.ru




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Шифрование данных
bell
Автор

Сообщений: 167
Откуда: Харьков
Дата регистрации: 04.04.2002
Hi Igor!

Цитата:
Сделав поиск по MD5 можно получить ответ гораздо быстрее, чем ожидая тут...
forum.foxclub.ru
Спасибо за ссылку. Я искал в новом форуме, а про старый забыл.
Рано я отрапортовал о закрытии проблемы. После исправления кода проверки пароля нашлась даже машина с Win98, на которой не распознался пароль. Точнее, на всех машинах в моей рабочей сети все нормально, а на других отдельных машинах или в других локальных сетях выскакивают сообщения "Error: " и/или "Неверный пароль." Более точный код проверки пароля:
LOCAL lcEncryptedStream, lcPassWord, lcKey
lcEncryptedStream = ''
lcPassWord = THISFORM.txtPass.Value
lcKey = 'abc12345'
IF !THISFORM._cryptapi1.EncryptSessionStreamString(lcPassWord, lcKey, @lcEncryptedStream)
MESSAGEBOX('Error: '+MESSAGE(), ...)
ENDIF
IF lcEncryptedStream # v_users.cPassword
MESSAGEBOX('Неверный пароль.', ...)
THISFORM.txtPass.SetFocus
RETURN
ENDIF
Так вот, в случае ошибки MESSAGE() возвращает пустую строку, после "Error: " в сообщении ничего нет.
В каких случаях EncryptSessionStreamString возвращает .F. ?
Нужно ли задать NOCPTRANS для поля v_users.cPassword, в котором хранится зашифрованный пароль?
Может ли отсутствовать "Microsoft Base Cryptographic Provider v1.0" на данной машине? Не нужно ли его устанавливать?
Ratings: 0 negative/0 positive
Re: Шифрование данных
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi bell!

Цитата:
В каких случаях EncryptSessionStreamString возвращает .F.
Очевидно когда не смог зашифровать... А это процесс сложный, этапов
несколько - получение ключа, собственно шифрация...
Цитата:
Нужно ли задать NOCPTRANS для поля v_users.cPassword, в котором
хранится зашифрованный пароль
Конечно - там же бинарные данные.
Цитата:
Может ли отсутствовать "Microsoft Base Cryptographic Provider v1.0"
на данной машине
Интересный вопрос!
Попробуй посоветовать тем бедолагам накатить все имеющиеся SP/HotFix на
винду, установить максимально возможную версию IE (ну хотя-бы 5.5). Если не
поможет, то переставить с нуля винду (если это Win98 и ничего приличнее не
тянет, то лучше чтобы заменили на Win98 SE - с проверенного дистрибутива).




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Шифрование данных
bell
Автор

Сообщений: 167
Откуда: Харьков
Дата регистрации: 04.04.2002
Hi Igor!

По поводу шифрования паролей решил все-таки не связываться с CryptoAPI.
По поводу хеширования данных: наверное, следует ожидать аналогичные проблемы на разных машинах?
Ratings: 0 negative/0 positive
Re: Шифрование данных
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi bell!

Не знаю, шифрованием сам вплотную не занимался, а хеш он и в Африке хеш (уж куда как проще чем шифрование со всей его кучей параметров и "умолчаний" - типа тех что были из-за запрета экспорта криптостойких алгоритмов из США ) - не веришь Windows CryptoAPI - возьми реализацию в dll-ке, или вообще чисто фоксовую (IMHO это конечно извращение, но такая процедура для MD5 есть скажем на fox.wikis.com)




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Шифрование данных
Димон Ш
Зачем закатывать солнце вручную. В инете лежат ActiveX компоненты для шифрования, чем тебе они не подходят?
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 37 (Гостей: 37)

© 2000-2024 Fox Club 
Яндекс.Метрика