Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Delphi + podpis elektroniczny

380 views
Skip to first unread message

kwapek

unread,
Feb 2, 2012, 9:18:24 AM2/2/12
to
Witam,

mam pytanie do szanownych grupowiczów, czy ktoś może już walczył z
podpisywaniem danych podpisem elektronicznym z poziomu programu w
delphi.

Potrzebuję dwie sprawy :
1. podpisanie zawartości recordu w bazie (np. dane mogą być zapisane
jako XML w osobnym pliku i podpisane lub też jakiś inny sposób)
2. logowanie do programu przy użyciu podpisu kwalifikowanego.

Muszę zaimplementować takie funkcjonalności w programie i nie bardzo
wiem jak to ugryźć.
Oczywiście udostępnienie rozwiązania na zasadach komercyjnych jest jak
najbardziej do przyjęcia

kons...@wp.pl

unread,
Feb 2, 2012, 9:47:17 AM2/2/12
to
Net -> podobno 3 linijki - inni robią jako plugin

Delphi -> http://pemi.ayz.pl/forum/viewforum.php?f=44


Taka namiastka (próbowałem jak to działa).

function TMainForm.PodpiszPlikXML (const TrescPlikuXML : string): string;
const
S_OK = 536870912;
S_FALSE = -1610350591;
var
EC2XADES: TEC2XADES;
TrescBledu : string;
katalog : PChar;
bufor : PChar;
SL : TStringList;


begin
GetMem (katalog, MAX_PATH);
GetTempPath (MAX_PATH, katalog);
GetMem (bufor, MAX_PATH);
if GetTempFileName (katalog, 'dek', 0, bufor)=0 then Exit;
SL := TStringList.Create;
SL.Text := Memo1.Text;
SL.SaveToFile(bufor);
SL.Free;
try
EC2XADES:= TEC2XADES.Create(nil);
with EC2XADES do
try
SetFileToSign(0,'file:///'+bufor,'');
if GetErrorCode = S_FALSE then
begin
TrescBledu:= GetErrorDescription ;
Result:=TrescBledu;
end else
begin
Sign(0);
if GetErrorCode = S_OK then
begin
Result:= GetSigned;
Exit;
end else
begin
TrescBledu:= GetErrorDescription;
Result:=TrescBledu;
end;
end;
finally
FreeMem(bufor);
FreeMem(katalog);

EC2XADES.Free;
end;
except
on E:Exception do TrescBledu:= E.Message;
end;
end;

Wojciech "Spook" Sura

unread,
Feb 2, 2012, 10:37:35 AM2/2/12
to
Dnia 02.02.2012 o 15:18 kwapek <kwa...@poczta.onet.pl> napisał(a):

> Witam,
>
> mam pytanie do szanownych grupowiczów, czy ktoś może już walczył z
> podpisywaniem danych podpisem elektronicznym z poziomu programu w
> delphi.
>
> Potrzebuję dwie sprawy :
> 1. podpisanie zawartości recordu w bazie (np. dane mogą być zapisane
> jako XML w osobnym pliku i podpisane lub też jakiś inny sposób)
> 2. logowanie do programu przy użyciu podpisu kwalifikowanego.
>
> Muszę zaimplementować takie funkcjonalności w programie i nie bardzo
> wiem jak to ugryźć.

Takie coś realizuje się w następujący sposób. Przygotowuje Pan klucz
prywatny i publiczny. Nie muszę chyba dodawać, że tylko jeden powinien być
osadzony w programie. Drugim krokiem jest wykonanie skrótu danych; za
mojej wiedzy obecnie za bezpieczny algorytm uważa się sha1, ale to już
proszę sprawdzić samemu, mogę się mylić. Hashet następnie jest szyfrowany
kluczem prywatnym i umieszczany z danymi. Weryfikacja jest prosta:
wykonujemy ponownie hashet danych, rozszyfrowujemy zapamiętany wcześniej
podpis kluczem publicznym i porównujemy hashety. Jeśli nie są zgodne, to
znaczy, że ktoś mieszał w danych.

Jeśli chodzi o algorytmikę, to z pomocą przychodzi tu sam system
operacyjny. Bodaj od 2000 wzwyż zawiera on cały interface pozwalający na
szyfrowanie, deszyfrowanie i hashowanie danych. Proszę poczytać tutaj:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa375538(v=vs.85).aspx

W .NET - jak zauważył kolega - jest to bardzo łatwe, bo wystarczy
skorzystać z, bodaj, System.Security.Cryptography. Nie wiem, czy rtl
Delphi zawiera już opakowanie CryptoAPI, ale nawet jeśli nie, to zapewne
ktoś zdążył już przepisać odpowiednie nagłówki. Jeśli wpisze Pan
'CryptoAPI Delphi' w Google, pojawia się sporo artykułów, proszę już
poszperać samemu :)

Pozdrawiam -- Spook.

--
! ._______. Warning: Lucida Console sig! //) !
! || spk || www.spook.freshsite.pl / _ """*!
! ||_____|| spook at op.pl / ' | ""!
! | ___ | tlen: spoko_ws gg:1290136 /. __/"\ '!
! |_|[]_|_| May the SOURCE be with you! \/) \ !

Paweł Matejski

unread,
Feb 2, 2012, 6:56:23 PM2/2/12
to
W dniu 02.02.2012 16:37, Wojciech "Spook" Sura pisze:
> Dnia 02.02.2012 o 15:18 kwapek <kwa...@poczta.onet.pl> napisał(a):
>
>> Witam,
>>
>> mam pytanie do szanownych grupowiczów, czy ktoś może już walczył z
>> podpisywaniem danych podpisem elektronicznym z poziomu programu w
>> delphi.
>>
>> Potrzebuję dwie sprawy :
>> 1. podpisanie zawartości recordu w bazie (np. dane mogą być zapisane
>> jako XML w osobnym pliku i podpisane lub też jakiś inny sposób)
>> 2. logowanie do programu przy użyciu podpisu kwalifikowanego.
>>
>> Muszę zaimplementować takie funkcjonalności w programie i nie bardzo
>> wiem jak to ugryźć.
>
> Takie coś realizuje się w następujący sposób. Przygotowuje Pan klucz prywatny i publiczny. Nie muszę chyba dodawać, że
> tylko jeden powinien być osadzony w programie. Drugim krokiem jest wykonanie skrótu danych; za mojej wiedzy obecnie za
> bezpieczny algorytm uważa się sha1, ale to już proszę sprawdzić samemu, mogę się mylić. Hashet następnie jest szyfrowany
> kluczem prywatnym i umieszczany z danymi. Weryfikacja jest prosta: wykonujemy ponownie hashet danych, rozszyfrowujemy
> zapamiętany wcześniej podpis kluczem publicznym i porównujemy hashety. Jeśli nie są zgodne, to znaczy, że ktoś mieszał w
> danych.

A jak się realizuje rozwijanie aplikacji, np. dodanie nowej kolumny do tabeli, wtedy hash się zmieni?

--
P.M.

m

unread,
Feb 3, 2012, 3:01:53 AM2/3/12
to
> A jak się realizuje rozwijanie aplikacji, np. dodanie nowej kolumny do
> tabeli, wtedy hash się zmieni?
>
A to zależy jak sobie to już zrobisz,
jak skrót danych brałby pod uwagę też dodatkowo strukturę tabeli (lub
jej skrót) to każda zmiana tabeli powodowała by "rozjechanie się" .

Jak skrót jest tylko dla danych to tylko zmiana danych powoduje że jest
poprawny albo nie.

M





kons...@wp.pl

unread,
Feb 3, 2012, 5:10:08 AM2/3/12
to
trzeba uważać na X.509 -> polskie certyfikaty kwalifikowane

http://support.microsoft.com/kb/938397

A to jest potrzebne między innymi do polskich e-deklaracji.

Paweł Matejski

unread,
Feb 3, 2012, 6:39:58 AM2/3/12
to
W dniu 03.02.2012 09:01, m pisze:
Ale jak jest nowa kolumna, to jest nowa dana! Null też jest daną, chyba, że nie interesuje cię, czy ktoś wstawia
(1,null,1) czy (1,1,null)?
Czyli, żeby podpisać rekord, trzeba też przechowywać dane jaki były podpisane.

Ale widzę kolejny problem. Jeśli ktoś edytuje rekord i zmieni tylko jedno pole, niejako podpisze się pod całością
zamazując poprzednie podpisy. Oczywiście zmiany można by logować, tylko po co wtedy podpisywać rekord.
Moim zdaniem najlepiej osobno trzymać log zmian i tylko tam podpisywać dane (dane, nie cały rekord).

--
P.M.

0 new messages