Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ] > Код на шару!
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.07.2015, 05:59
Arpada Arpada вне форума
Прохожий
 
Регистрация: 28.07.2015
Сообщения: 2
Версия Delphi: Delphi XE8
Репутация: 10
Печаль Составление базы данных с сертификатами

Есть задача считать из ЭЦП сертификата (.cert) данные о владельце и дату окончания действия сертификата. Итого мы должны получить базу данных, которая сама будет считывать данные из сертификатов(тут главное что не из одного а из множества одновременно) и оформление каждого из них в БД в виде строк с данными по столбцам.
Столбцы:
1.ФИО
2.E-mail
3.Дата окончания действия сертификата.

Есть исходник который парсит нудные мне данные но в лог файл, хотелось бы чтоб эти данные переводились в listview как описано выше.
Вот сам исходник и скрин с примером работы программы:
Код:
nit GetDataSert;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  Wcrypt2, XPBase64, Shared;

procedure BinToHexInverted(Buffer, Text: PChar; BufSize: Integer);
const
  Convert: Array [0 .. 15] of Char = '0123456789abcdef';
var
  ii: Integer;
begin
  for ii := BufSize - 1 downto 0 do
  begin
    Text[0] := Convert[Byte(Buffer[ii]) shr 4];
    Text[1] := Convert[Byte(Buffer[ii]) and $F];
    Inc(Text, 2);
  end;
end;

function DecodeSerialNumber(Source: CRYPT_INTEGER_BLOB): String;
begin
  SetLength(Result, Source.cbData * 2);
  BinToHexInverted(PChar(Source.pbData), Pointer(Result), Source.cbData);
end;

function DecodeName(Source: CERT_NAME_BLOB;
  encType: DWORD = X509_ASN_ENCODING or PKCS_7_ASN_ENCODING;
  strType: DWORD = CERT_X500_NAME_STR): String;
var
  iLength: DWORD;
begin
  iLength := CertNameToStr(encType, @Source, strType, nil, 0);
  SetLength(Result, iLength);
  iLength := CertNameToStr(encType, @Source, strType, Pointer(Result), iLength);
  SetLength(Result, iLength);
end;

function FileTime2DateTime(FileTime: TFileTime): TDateTime;
var
  LocalFileTime: TFileTime;
  SystemTime: TSystemTime;
begin
  FileTimeToLocalFileTime(FileTime, LocalFileTime);
  FileTimeToSystemTime(LocalFileTime, SystemTime);
  Result := SystemTimeToDateTime(SystemTime);
end;

procedure LOG(S: String);
begin
  Form1.Memo1.Lines.Add(S);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  cert: PCCERT_CONTEXT;
  M: TMemoryStream;
  encType: DWORD;
  PS: Pbyte;
  sz: DWORD;
  skip: DWORD;
  flags: DWORD;
  I: Integer;
begin
  if OpenDialog1.Execute then
  begin
    Memo1.Clear;
    M := TMemoryStream.Create;
    try
      M.LoadFromFile(OpenDialog1.FileName);
      encType := X509_ASN_ENCODING or PKCS_7_ASN_ENCODING;
      cert := CertCreateCertificateContext(encType, M.Memory, M.Size);
      if not Assigned(cert) then
      begin
        //
        flags := CRYPT_STRING_BASE64REQUESTHEADER;
        CryptStringToBinary(Pointer(M.Memory), M.Size, flags, nil, sz,
          skip, flags);
        GetMem(PS, sz);
        try
          CryptStringToBinary(Pointer(M.Memory), M.Size, flags, Pointer(PS), sz,
            skip, flags);
          cert := CertCreateCertificateContext(encType, PS, sz);
        finally
          FreeMem(PS);
        end;
        //
      end;
      if Assigned(cert) then
      begin
        try
          //
          LOG(FormatDateTime('Действителен с: dd.mm.yyyy',
            FileTime2DateTime(cert^.pCertInfo^.NotBefore)));
          LOG(FormatDateTime('Действителен до: dd.mm.yyyy',
            FileTime2DateTime(cert^.pCertInfo^.NotAfter)));
          LOG('Субъект: ' + DecodeName(cert^.pCertInfo^.Subject));
          LOG('Поставщик: ' + DecodeName(cert^.pCertInfo^.Issuer));
          LOG('******');
          LOG('Парсим мыло субъекта: ' + GetValue('',
            DecodeName(cert^.pCertInfo^.Subject), 'E=', ',', I));
          LOG('******');
          LOG('Серийный номер: ' + DecodeSerialNumber
            (cert^.pCertInfo^.SerialNumber));
        finally
          if not CertFreeCertificateContext(cert) then
            ShowMessage(SysErrorMessage(GetLastError));
        end;
      end
      else
        ShowMessage(SysErrorMessage(GetLastError));;
    finally
      M.Free;
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

end.
Изображения
Тип файла: png чтение.PNG (15.3 Кбайт, 7 просмотров)
Ответить с цитированием
  #2  
Старый 28.07.2015, 16:26
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Ну? Очевидно, в этом коде данные получаются из
Код:
cert^.pCertInfo^.NotBefore
cert^.pCertInfo^.NotAfter
cert^.pCertInfo^.Subject
cert^.pCertInfo^.Issuer
cert^.pCertInfo^.Subject
cert^.pCertInfo^.SerialNumber
Взять их и запихнуть в бд.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 28.07.2015, 16:38
Arpada Arpada вне форума
Прохожий
 
Регистрация: 28.07.2015
Сообщения: 2
Версия Delphi: Delphi XE8
Репутация: 10
По умолчанию

Тогда вопрос, для этих данных стоит объявить глобальные переменные, и пихать в бд уже в другой процедуре? И второе, как их запихнуть в listview.
P.S сам не работал до этого с этим элементом, но видел пример реализации бд при помощи него у друга по двум вариантам, первое это чтение нужных параметров из файла и раскидывание их по нужным столбцам, второе добавление в ручную через Edit. Вот интересует из этого первый...как заносить данные которые уже считали, через массивы или вектора?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter