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...
Database şifresini hack engelleme...
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: Database şifresini hack engelleme...
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.
Ö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.
Re: Database şifresini hack engelleme...
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ı...
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ı...
Re: Database şifresini hack engelleme...
İlk verdiğim cevabın linkinde de daha önceden belirttiğim gibi "hack edilemeyecek" diye birşey maalesef yok.
Re: Database şifresini hack engelleme...
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.
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.
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/)
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/)