Database şifresini hack engelleme...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
hido
Üye
Mesajlar: 268
Kayıt: 29 Mar 2014 04:32

Database şifresini hack engelleme...

Mesaj gönderen hido »

Selam.

Uygulamamda web de bulunan db ye bağlantı sağlıyorum, ancak (Server, User_Name ve Password) gibi bilgilerin başka kişilerin eline geçmemesi için de nasıl bir yöntem uyguluyaya bilirim.

aşağıdaki yöntem ile bağlantı yapıyorum fakat ne kadar güvenli bilemedim...


Web.deneme.com/sifre.xml den (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, R, S, T, U, V, Y, Z) harflerinde copy ile 5,8,9,12,24. karakteri içinden alarak uygulamanın DB şifresini alıyorum bu yöntem ne kadar güvenli veya nasıl bir yötem kullanabilirim...
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Database şifresini hack engelleme...

Mesaj gönderen ertank »

Merhaba,

Öncelikle soru basit gibi gözükmekle birlikte uzmanlık dalı sorusudur.

Aklıma gelen birkaç noktayı yazayıyorum. Ancak kesinlikle daha detaylı araştırmalı ve uzman arkadaşların tavsiyelerini dinlemeniz gerekir:
1- Kendi uygulamanız tarafında daha önceden şifrelenmiş bir dosyadan şifre bilgisini okuyabilirsiniz.
viewtopic.php?f=2&t=35766&p=193511&hilit=aes256#p192820
2- Sunucu tarafında şifreyi gündelik kelimeler içermeyecek karmaşık bir şifre olarak ayarlamanızda fayda var.
3- Sunucu tarafında şifre güvenliğini destekleyen firewall, VPN, IP filtreleme, standart database bağlantı portu dışında bir port üzerinden bağlantı kurma yöntemlerini kullanarak güvenliği arttırmakta fayda vardır.
4- Database ve web sunucu (eğer web üzerinden veri erişimi var ise) ayrı sunucularda durmalı
5- Sunucudan uygulama tarafına veri alınıyor ise bunların da şifrelenmesinde fayda var. Sunucu yedeklerinin de şifrelenmesi gerekmektedir.
Kullanıcı avatarı
hido
Üye
Mesajlar: 268
Kayıt: 29 Mar 2014 04:32

Re: Database şifresini hack engelleme...

Mesaj gönderen hido »

Güzel bir çözüm fakat çok basit değil mi?

Projede hack edilemeyecek veya başka bir değişle görünmez olabilecek bir yereden şifreyi alıp db bağlantı kurma şansım yok mu?

Tabi bu işlem android ve ios içinde geçerli olmalı...
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Database şifresini hack engelleme...

Mesaj gönderen ertank »

İlk verdiğim cevabın linkinde de daha önceden belirttiğim gibi "hack edilemeyecek" diye birşey maalesef yok.
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: Database şifresini hack engelleme...

Mesaj gönderen csunguray »

AES şifreleme yaparak parolayı gizleyebilirsiniz. Aşağıdaki bağlantıdan meşhur TurboPower Lockbox kütüphanesinin tüm platformlarda çalışan güncellenmiş sürümünü indirebilirsiniz.

Free Encryption Library In Delphi XE7 Firemonkey On Android, IOS, Windows, And OSX
http://www.fmxexpress.com/free-encrypti ... s-and-osx/

Ben daha basit bir şey kullanıyorum. Ama sadece Windows'ta çalışıyor.

Kod: Tümünü seç

unit XECryptoUtils;

// XE8 Compatibility
// http://www.cnblogs.com/cb168/p/4678901.html

interface

function AES128_Encrypt(Value, Password: string): string;
function AES128_Decrypt(Value, Password: string): string;
function DecryptStringHex(ASourceStr: String; AKeyStr: String): String;
function EncryptStringHex(ASourceStr: String; AKeyStr: String): String;

implementation

uses
  SysUtils,
  Windows,
  IdCoderMIME
  {$IF CompilerVersion >= 29.0}
  , IdGlobal
  {$IFEND}
  ;

//-------------------------------------------------------------------------------------------------------------------------
//    Base64 Encode/Decode
//-------------------------------------------------------------------------------------------------------------------------

{$IF CompilerVersion >= 29.0}
function Base64_Encode(Value: TIdBytes): string;
{$ELSE}
function Base64_Encode(Value: TBytes): string;
{$IFEND}
var
  Encoder: TIdEncoderMIME;
begin
  Encoder := TIdEncoderMIME.Create(nil);
  try
    Result := Encoder.EncodeBytes(Value);
  finally
    Encoder.Free;
  end;
end;

{$IF CompilerVersion >= 29.0}
function Base64_Decode(Value: string): TIdBytes;
{$ELSE}
function Base64_Decode(Value: string): TBytes;
{$IFEND}
var
  Encoder: TIdDecoderMIME;
begin
  Encoder := TIdDecoderMIME.Create(nil);
  try
    Result := Encoder.DecodeBytes(Value);
  finally
    Encoder.Free;
  end;
end;

//-------------------------------------------------------------------------------------------------------------------------
//    WinCrypt.h
//-------------------------------------------------------------------------------------------------------------------------

type
  HCRYPTPROV  = Cardinal;
  HCRYPTKEY   = Cardinal;
  ALG_ID      = Cardinal;
  HCRYPTHASH  = Cardinal;

const
  _lib_ADVAPI32    = 'ADVAPI32.dll';
  CALG_SHA_256     = 32780;
  CALG_AES_128     = 26126;
  CRYPT_NEWKEYSET  = $00000008;
  PROV_RSA_AES     = 24;
  KP_MODE          = 4;
  CRYPT_MODE_CBC   = 1;

function CryptAcquireContext(var Prov: HCRYPTPROV; Container: PChar; Provider: PChar; ProvType: LongWord; Flags: LongWord): LongBool; stdcall; external _lib_ADVAPI32 name 'CryptAcquireContextW';
function CryptDeriveKey(Prov: HCRYPTPROV; Algid: ALG_ID; BaseData: HCRYPTHASH; Flags: LongWord; var Key: HCRYPTKEY): LongBool; stdcall; external _lib_ADVAPI32 name 'CryptDeriveKey';
function CryptSetKeyParam(hKey: HCRYPTKEY; dwParam: LongInt; pbData: PBYTE; dwFlags: LongInt): LongBool stdcall; stdcall; external _lib_ADVAPI32 name 'CryptSetKeyParam';
function CryptEncrypt(Key: HCRYPTKEY; Hash: HCRYPTHASH; Final: LongBool; Flags: LongWord; pbData: PBYTE; var Len: LongInt; BufLen: LongInt): LongBool;stdcall;external _lib_ADVAPI32 name 'CryptEncrypt';
function CryptDecrypt(Key: HCRYPTKEY; Hash: HCRYPTHASH; Final: LongBool; Flags: LongWord; pbData: PBYTE; var Len: LongInt): LongBool; stdcall; external _lib_ADVAPI32 name 'CryptDecrypt';
function CryptCreateHash(Prov: HCRYPTPROV; Algid: ALG_ID; Key: HCRYPTKEY; Flags: LongWord; var Hash: HCRYPTHASH): LongBool; stdcall; external _lib_ADVAPI32 name 'CryptCreateHash';
function CryptHashData(Hash: HCRYPTHASH; Data: PChar; DataLen: LongWord; Flags: LongWord): LongBool; stdcall; external _lib_ADVAPI32 name 'CryptHashData';
function CryptReleaseContext(hProv: HCRYPTPROV; dwFlags: LongWord): LongBool; stdcall; external _lib_ADVAPI32 name 'CryptReleaseContext';
function CryptDestroyHash(hHash: HCRYPTHASH): LongBool; stdcall; external _lib_ADVAPI32 name 'CryptDestroyHash';
function CryptDestroyKey(hKey: HCRYPTKEY): LongBool; stdcall; external _lib_ADVAPI32 name 'CryptDestroyKey';

//-------------------------------------------------------------------------------------------------------------------------

{$WARN SYMBOL_PLATFORM OFF}

function __CryptAcquireContext(ProviderType: Integer): HCRYPTPROV;
begin
  if (not CryptAcquireContext(Result, nil, nil, ProviderType, 0)) then
  begin
    if HRESULT(GetLastError) = NTE_BAD_KEYSET then
      Win32Check(CryptAcquireContext(Result, nil, nil, ProviderType, CRYPT_NEWKEYSET))
    else
      RaiseLastOSError;
  end;
end;

function __AES128_DeriveKeyFromPassword(m_hProv: HCRYPTPROV; Password: string): HCRYPTKEY;
var
  hHash: HCRYPTHASH;
  Mode: DWORD;
begin
  Win32Check(CryptCreateHash(m_hProv, CALG_SHA_256, 0, 0, hHash));
  try
    Win32Check(CryptHashData(hHash, PChar(Password), Length(Password) * SizeOf(Char), 0));
    Win32Check(CryptDeriveKey(m_hProv, CALG_AES_128, hHash, 0, Result));
    // Wine uses a different default mode of CRYPT_MODE_EBC
    Mode := CRYPT_MODE_CBC;
    Win32Check(CryptSetKeyParam(Result, KP_MODE, Pointer(@Mode), 0));
  finally
    CryptDestroyHash(hHash);
  end;
end;

function AES128_Encrypt(Value, Password: string): string;
var
  hCProv: HCRYPTPROV;
  hKey: HCRYPTKEY;
  lul_datalen: Integer;
  lul_buflen: Integer;
  {$IF CompilerVersion >= 29.0}
  Buffer: TIdBytes;
  ABuffer : TBytes;
  {$ELSE}
  Buffer: TBytes;
  {$IFEND}
begin
  Assert(Password <> '');
  if (Value = '') then
    Result := ''
  else
  begin
    hCProv := __CryptAcquireContext(PROV_RSA_AES);
    try
      hKey := __AES128_DeriveKeyFromPassword(hCProv, Password);
      try
        // allocate buffer space
        lul_datalen := Length(Value) * SizeOf(Char);
        {$IF CompilerVersion >= 29.0}
        ABuffer := TEncoding.Unicode.GetBytes(Value + '        ');
        Buffer := RawToBytes(ABuffer[0], Length(ABuffer));
        {$ELSE}
        Buffer := TEncoding.Unicode.GetBytes(Value + '        ');
        {$IFEND}
        lul_buflen := Length(Buffer);
        // encrypt to buffer
        Win32Check(CryptEncrypt(hKey, 0, True, 0, @Buffer[0], lul_datalen, lul_buflen));
        SetLength(Buffer, lul_datalen);
        // base 64 result
        Result := Base64_Encode(Buffer);
      finally
        CryptDestroyKey(hKey);
      end;
    finally
      CryptReleaseContext(hCProv, 0);
    end;
  end;
end;

function AES128_Decrypt(Value, Password: string): string;
var
  hCProv: HCRYPTPROV;
  hKey: HCRYPTKEY;
  lul_datalen: Integer;
  {$IF CompilerVersion >= 29.0}
  Buffer: TIdBytes;
  ABuffer : TBytes;
  {$ELSE}
  Buffer: TBytes;
  {$IFEND}
begin
  Assert(Password <> '');
  if Value = '' then
    Result := ''
  else
  begin
    hCProv := __CryptAcquireContext(PROV_RSA_AES);
    try
      hKey := __AES128_DeriveKeyFromPassword(hCProv, Password);
      try
        // decode base64
        Buffer := Base64_Decode(Value);
        // allocate buffer space
        lul_datalen := Length(Buffer);
        // decrypt buffer to to string
        Win32Check(CryptDecrypt(hKey, 0, True, 0, @Buffer[0], lul_datalen));
        {$IF CompilerVersion >= 29.0}
        SetLength(ABuffer, lul_datalen);
        BytesToRaw(Buffer, ABuffer[0], lul_datalen);
        Result := TEncoding.Unicode.GetString(ABuffer, 0, lul_datalen);
        {$ELSE}
        Result := TEncoding.Unicode.GetString(Buffer, 0, lul_datalen);
        {$IFEND}
      finally
        CryptDestroyKey(hKey);
      end;
    finally
      CryptReleaseContext(hCProv, 0);
    end;
  end;
end;

function StringToHex(S: string): string;
var
	i: integer;
begin
  Result := '';
  // Go throught every single characters, and convert them
  // to hexadecimal...
	for i := 1 to Length( S ) do
  	Result := Result + IntToHex( Ord( S[i] ), 2 );
end;

function HexToString(S: string): string;
var
	i: integer;
begin
  Result := '';
  // Go throught every single hexadecimal characters, and convert
  // them to ASCII characters...
  for i := 1 to Length( S ) do
  begin
    // Only process chunk of 2 digit Hexadecimal...
  	if ((i mod 2) = 1) then
	  	Result := Result + Chr( StrToInt( '0x' + Copy( S, i, 2 )));
  end;
end;

function EncryptStringHex(ASourceStr: String; AKeyStr: String): String;
begin
  Result := AES128_Encrypt(ASourceStr, AKeyStr);
  Result := StringToHex(Result);
end;

function DecryptStringHex(ASourceStr: String; AKeyStr: String): String;
begin
  Result := AES128_Decrypt(HexToString(ASourceStr), AKeyStr);
end;

end.
XECryptoUtils.rar
(2 KiB) 93 kere indirildi
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
Cevapla