کریپتوگرافی در اندروید

بهترین راهکار انجام کریپتوگرافی در اندروید

کریپتوگرافی نقش بسیار مهمی در امنیت داده های کاربران بازی میکنند. این مسئله روی گوشی های موبایل اهمیت بیشتری دارد زیرا حمله کننده ها ممکن است بصورت فیزیکی به دستگاه کاربر دسترسی داشته باشند. در این مقاله از بلاگ برنامه چی نحوه استفاده درست از کریپتوگرافی در اندروید و همچنین مثال هایی کاربردی از آن صحبت میکنیم. البته اگر نیاز به سطح بالاتری از امنیت برای اپلیکیشن خودتان دارید، میتوانید از سیستم Android Keystore استفاده کنید. با برنامه چی همراه باشید.


مفاهیم کلیدی

هدف نهایی کریپتو گرافی این است که رازداری، یکپارچگی داده و اعتبار آنها را بصورت ثابت حفط کند، حتی اگر یک حمله در حال رخ دادن باشد. رازداری (Confidentiality) شامل اطمینان از حریم خصوصی داده ها با استفاده از کریپتوگرافی است. یکپارچگی داده (Data Integrity) با ثبات داده ها و تشخیص دستکاری شدن یا تغییر کردن آنها سر و کار دارد. اعتبار (Authenticity) شامل این میشود که مطمئن شویم داده ها از منبع مطمئنی می آیند.

مفاهیم کلیدی کریپتوگرافی

الگوریتم های Encryption متن های ساده را به متن هایی رمزی (که به آنها Cipher میگوییم) تبدیل میکنند و از این طریق محتوای اصلی پنهان میشود. سپس متن اصلی میتواند با روش Decryption از روی متن Cipher دوباره به دست بیاید. Encryption میتواند Symmetric (کدگذاری با secret-key) یا Asymmetric (کدگذاری با public-key) باشد. در حقیقت عملیات های کدگذاری از یکپارچگی داده ها محافظت نمیکنند. اما تعدادی از مود های کدگذاری Symmetric میتوانند این محافظت را هم ارائه بدهند.


الگوریتم های کدگذاری Symmatric-key

با استفاده از این الگوریتم ها، برای Encryption و Decryption از یک کلید یکسان استفاده میشود. این مدل از کدگذاری سرعت بالایی دارد و برای پردازش حجم زیادی از داده ها مناسب است. اما از آنجایی که اگر کسی به کلید ها دسترسی داشته باشد به راحتی میتواند داده ها را کدگشایی کند، استفاده از این روش نیاز به مدیریت بسیار خوب کلید ها دارد.


الگوریتم های کدگذاری Public-key

این الگوریتم ها با دو کلید جداگانه کار میکنند: کلید عمومی (Public Key) و کلید خصوصی (Private Key). کلید عمومی میتواند همه جا پخش شود اما کلید خصوصی نباید در اختیار هیچ کس قرار بگیرد. روش کار به این صورت است که یک پیام با کلید عمومی کد گذاری میشود اما فقط با کلید خصوصی میتوانیم آن را کدگشایی کنیم. از آنجایی که کدگذاری Asymmetric چند مرتبه کند تر از عملیات Symmetric است، معمولا برای رمز گذاری مقدار های کوچک داده از آن استفاده میشود. عملیات هایی مثل تولید کلید های Symmetric به منظور انجام کدگذاری های حجیم.


Hashing

hash در کریپتوگرافی

Hashing را نمیتوانیم به عنوان یکی از روش های کد گذاری در نظر بگیریم، اما Hashing از کریپتوگرافی استفاده میکند. توابع هش بصورت کاملا زورگویانه، تکه های دلخواهی از داده را گرفته و آنها را به مقدارهایی با طول یکسان تبدیل میکنند. از توابع Hash برای اعتبار سنجی یکپارچگی داده ها استفاده میشود، اما این تابع ها نمیتوانند اعتبار داده ها (Authenticity) را تضمین کنند.


Massage Authentication Codes یا MAC

MAC یا “کدهای اعتبار سنجی پیام” میتوانند مکانیزم های دیگر کریپتوگرافی (مثل کدگذاری Symmetric و Hash) را با Secret key ها ترکیب کند که بتواند اعتبار و یکپارچگی داده ها را تضمین کند. اما به هر حال برای تایید یک MAC، تعداد زیادی از Entity ها باید یک Secret Key را با هم به اشتراک بگذارند و هرکدام از آنها میتوانند یک MAC معتبر تولید کنند. یکی از رایج ترین انواع MAC ها که بیشتر مورد استفاده قرار میگیرد، HMAC است که برای کریپتوگرافی، از Hashing استفاده میکند. اسم کامل HMAC معمولا شامل نوع تابع Hash استفاده شده در آن هم میشود (برای مثال، درون HMAC-SHA256 تابع SHA-256 به کار رفته است).


امضا یا Signature

 Signature میتواند کریپتوگرافی Asymmetric (یعنی همان استفاده از جفت کلید های خصوصی و عمومی) را با Hashing ترکیب میکند که یکپارچگی و اعتبار داده ها را ارائه بدهد. این کار با کدگذاری Hash پیام با استفاده از کلید خصوصی صورت میگیرد. دقت کنید کلید خصوصی باید نزد کسی که داده ها را امضا میکند باقی بماند.


Key Derivation Functions یا KDF

KDF میتواند از یک مقدار مخفی، یک کلید مخفی (Secret) را بیرون بکشد (مثل یک رمز عبور). از KDF برای تبدیل کلید ها به فرمت های دیگر یا برای افزایش طول آنها استفاده میشود. در حقیقت KDF شبیه Hashing است اما استفاده های دیگری هم دارد (برای مثال، میتوانیم از آن ها به عنوان یکی از کامپوننت های پروتکل های Key-Agreement استفاده کنیم).

ما میتوانیم کامپوننت های اصلی سیستم کریپتوگرافی در اندروید را به این شکل تقسیم بندی کنیم:

  • Security Provider
  • KeyStore
  • KeyChain

API های کریپتوگرافی در اندروید بر اساس Java Cryptography Architecture یا JCA ساخته شده اند. JCA اینترفیس ها و پیاده سازی آنها را از هم جدا کرده و داشتن چندین Security Provider را برای ما ممکن میکند. با این کار ما میتوانیم مجموعه ای از الگوریتم های کریپتوگرافی را به کار ببریم. بیشتر اینترفیس های JCA درون پکیج های java.security.* و javax.crypto.* تعریف شده اند. علاوه بر اینها پکیج های مخصوص سیستم عامل اندروید android.security.* و android.security.keystore.* هستند.

کریپتوگرافی در اندروید

KeyStore و KeyChain هر دو API هایی برای مرتب سازی و استفاده از کلید ها ارائه میدهند (در پس زمینه، API های KeyChain از سیستم KeyStore استفاده میکنند). این سیستم ها به شما اجازه میدهند چرخه عمر کامل کلید ها را بتوانید مدیریت کنید. فاز های زیر در چرخه عمر وجود دارند:

  • تولید یک کلید
  • استفاده از یک کلید
  • ذخیره سازی کلید
  • آرشیو کردن کلید
  • حذف کردن کلید

این کلید ها توسط سیستم های KeyStore یا KeyChain مدیریت میشوند. اما باز هم نحوه کارکردن سیستم بستگی به روش پیاده سازی آن توسط توسعه دهنده اپلیکیشن دارد. برای آنالیز کردن این روش ها، باید روی متدهایی که برنامه نویس از آنها استفاده کرده است دقیق شویم. در حالت عادی باید تابع هایی را پیدا کنید که مراحل زیر را انجام میدهند:

  • تولید Key
  • تولید عدد رندوم
  • چرخش Key یا Key Rotation

نکته: به جز مواردی که بصورت صریح در نوشته گفته شده، این مقاله برای همه نسخه های اندروید مناسب است.

هشدار: در این مقاله قرار است بهترین راهکارهای پیاده سازی کریپتوگرافی در اندروید را بررسی کنیم. پس نیاز دارید که قبل از خواندن این مقاله، با روش های کریپتوگرافی در اندروید آشنا باشید. اگر در مورد این کار چیزی نمیدانید، این مقاله مناسب شما نیست.


تعریف یک Provider (فقط وقتی از سیستم Keystore استفاده میکنید)

اگر از سیستم Keystore استفاده میکنید، باید حتما یک provider تعریف شود. اما در بقیه شرایط سیستم عامل اندروید Provider خاصی را برای الگوریتم داده شده تایید نمیکند. اگر بدون استفاده از سیستم Keystore اقدام به تعریف کردن Provider کنید، ممکن است در آینده و بعد از منتشر شدن نسخه های بعدی اندروید با مشکلات زیادی روبرو شوید.


انتخاب یک الگوریتم مناسب

وقتی برای انتخاب الگوریتم های کریپتوگرافی دستتان باز باشد (یعنی مثلا نیاز نداشته باشید با یک سیستم دیگر سازگاری پیدا کنید)َ، میتوانید از الگوریتم های پیشنهاد شده زیر استفاده کنید.

کلاسپیشنهاد
CipherAES در یکی از مود های CBC یا GCM با کلید 256 بیتی (مانند AES/GCM/NoPadding)
MessageDigestخانواده SHA-2 (مثلا SHA-256)
MacHMAC خانواده SHA-2 (مثل HMACSHA256)
Signatureخانواده SHA-2 به همراه ECDSA (مثل SHA256withECDSA)

نکته: وقتی که میخواهید عمل نوشتن و خواندن فایل ها را انجام بدهید، میتوانید برای تامین امنیت این کار از کتابخانه Security در اندروید کمک بگیرید تا این عملیات در یک محیط ایمن تر انجام بشود. این کتابخانه یک الگوریتم پیشنهاد شده برای رمزگذاری را در اختیار شما قرار میدهد.


انجام عملیات های عمومی کریپتوگرافی

عملیات های عمومی کریپتوگرافی

در قسمت های بعدی تکه کدهایی را مشاهده میکنید که به شما نشان میدهد چگونه میتوانید عملیات های رایج کریپتوگرافی را در اپلیکیشن خودتان انجام بدهید.


خواندن فایل

// Although you can define your own key generation parameter specification, it's
// recommended that you use the value specified here.
Context context = getApplicationContext();
MasterKey mainKey = new MasterKey.Builder(context)
        .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
        .build();
String fileToRead = "my_sensitive_data.txt";
EncryptedFile encryptedFile = new EncryptedFile.Builder(context,
        new File(DIRECTORY, fileToRead),
        mainKey,
        EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build();

InputStream inputStream = encryptedFile.openFileInput();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int nextByte = inputStream.read();
while (nextByte != -1) {
    byteArrayOutputStream.write(nextByte);
    nextByte = inputStream.read();
}

byte[] plaintext = byteArrayOutputStream.toByteArray();

نوشتن فایل

// Although you can define your own key generation parameter specification, it's
// recommended that you use the value specified here.
Context context = getApplicationContext();
MasterKey mainKey = new MasterKey.Builder(context)
        .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
        .build();

// Create a file with this name, or replace an entire existing file
// that has the same name. Note that you cannot append to an existing file,
// and the file name cannot contain path separators.
String fileToWrite = "my_sensitive_data.txt";
EncryptedFile encryptedFile = new EncryptedFile.Builder(context,
        new File(DIRECTORY, fileToWrite),
        mainKey,
        EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build();

byte[] fileContent = "MY SUPER-SECRET INFORMATION"
        .getBytes(StandardCharsets.UTF_8);
OutputStream outputStream = encryptedFile.openFileOutput();
outputStream.write(fileContent);
outputStream.flush();
outputStream.close();

رمزگذاری یک پیام

byte[] plaintext = ...;
KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init(256);
SecretKey key = keygen.generateKey();
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] ciphertext = cipher.doFinal(plaintext);
byte[] iv = cipher.getIV();

تولید یک Massage Digest

کریپتوگرافی

برای تولید یک Massage Digest باید یک آبجکت از PrivateKey داشته باشید که شامل signing key باشد. این آبجکت را میتوانید در زمان اجرای اپلیکیشن ایجاد کنید، از روی یک فایل که در اپلیکیشن وجود دارد بخوانید یا با توجه به نیاز هایتان از منابع دیگر آن را تامین کنید.

byte[] message = ...;
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] digest = md.digest(message);

تایید Digital Signature (امضای دیجیتال)

برای این کار شما باد یک آبجکت PublicKey داشته باشید که شامل کلید عمومی مربوط به Signer باشد. میتوانید این آبجکت را از روی یک فایل درون اپلیکیشن خودتان بخوانید، از درون یک Certificate استخراج کنید، یا بر اساس نیاز های خودتان از منابع دیگر آن را دریافت کنید.

byte[] message = ...;
PrivateKey key = ...;
Signature s = Signature.getInstance("SHA256withECDSA");
s.initSign(key);
s.update(message);
byte[] signature = s.sign();

شناسایی الگوریتم های نا امن یا منسوخ شده

وقتی که یک اپلیکیشن موبایل را بررسی میکنیم، باید مطمئن شویم که از الگوریتم های و پروتکل های کریپتوگرافی که دارای ضعف های شناخته شده یا عدم امنیت کافی برای نیاز های جدید هستند، استفاده نمیکند. این نکته را یادتان باشد که الگوریتم هایی که قبلا ایمن بودند ممکن است با گذشت زمان نا ایمن شده باشند. پس بررسی دوره ای بهترین راهکارهای کریپتوگرافی و پیاده سازی آنها در اپلیکیشن برای تامین امنیت داده ها ضروری است.

الگوریتم های نا امن در کریپتوگرافی

باید مطمئن شویم الگوریتم های کریپتوگرافی به روز هستند و از استانداردهای صنعت پیروی میکنند. الگوریتم هایی که آسیب پذیر هستند شامل Block Cipher های از رده خارج شده (مانند DES و 3DES)، Stream Cipher ها (مانند RC4)، توابع هش (مانند MD5 و SHA1) و تولید کننده های عدد رندوم از کار افتاده (مانند Dual_EC_DRBG و SHA1PRNG) میشوند. نکته مهم این است که الگوریتم هایی که دارای گواهینامه هستند (مثلا گواهینامه های NIST) هم میتوانند با گذشت زمان ایمنی خود را از دست بدهند. یعنی نباید بخاطر گواهینامه دار بودن یک الگوریتم، بررسی های دوره ای آن را متوقف کنید. الگوریتم هایی که ضعف های شناخته شده دارند، باید با موارد قدرتمند تر جایگزین شوند. پس باید کدهای اپلیکیشن را برای پیدا کردن الگوریتم های ضعیف مورد برررسی قرار بدهیم. تعدادی از این الگوریتم ها را در ادامه میبینید:

  • DES, 3DES
  • RC2
  • RC4
  • BLOWFISH
  • MD4
  • MD5
  • SHA1

الگوریتم های پشتیبانی شده در اندروید

الگوریتم های اندروید

این لیست، تعدادی از الگوریتم های JCA هستند که روی سیستم عامل اندروید در هر سطح API در دسترس هستند. جزئیات این موارد را در ادامه مشاهده میکنید.

  • AlgorithmParameterGenerator
  • AlgorithmParameters
  • CertPathBuilder
  • CertPathValidator
  • CertStore
  • CertificateFactory
  • Cipher
  • KeyAgreement
  • KeyFactory
  • KeyGenerator
  • KeyManagerFactory
  • KeyPairGenerator
  • KeyStore
  • Mac
  • MessageDigest
  • SSLContext
  • SSLEngine.Supported
  • SSLSocket.Supported
  • SecretKeyFactory
  • SecureRandom
  • Signature
  • TrustManagerFactory

AlgorithmParameterGenerator

الگوریتمAPI پشتیبانی شده
AES1-8
DES1-8
DESede1-8
DH1+
DSA1+

AlgorithmParameters

الگوریتمAPI پشتیبانی شده
AES1+
BLOWFISH10+
ChaCha2028+
DES1+
DESede1+
DH1+
DSA1+
EC26+
GCM22+
IES1-8
OAEP1+
PBEwithHmacSHA1AndAES_12826+
PBEwithHmacSHA1AndAES_25626+
PBEwithHmacSHA224AndAES_12826+
PBEwithHmacSHA224AndAES_25626+
PBEwithHmacSHA256AndAES_12826+
PBEwithHmacSHA256AndAES_25626+
PBEwithHmacSHA384AndAES_12826+
PBEwithHmacSHA384AndAES_25626+
PBEwithHmacSHA512AndAES_12826+
PKCS12PBE1+
PSS1-8,24+

CertPathBuilder

الگوریتمAPI پشتیبانی شده
PKIX1+

CertPathValidator

الگوریتمAPI پشتیبانی شده
PKIX1+

CertStore

الگوریتمAPI پشتیبانی شده
Collection1+

CertificateFactory

الگوریتمAPI پشتیبانی شده
X.5091+

Cipher

الگوریتممود هاPaddingsAPI پشتیبانی شدهنکته
AESCBC
CFB
CTR
CTS
ECB
OFB
ISO10126Padding
NoPadding
PKCS5Padding
1+
AESGCMNoPadding10+
AES_128CBC
ECB
NoPadding
PKCS5Padding
26+
AES_128GCMNoPadding26+
AES_256CBC
ECB
NoPadding
PKCS5Padding
26+
AES_256GCMNoPadding26+
ARC4ECBNoPadding10+
ARC4NONENoPadding28+
BLOWFISHCBC
CFB
CTR
CTS
ECB
OFB
ISO10126Padding
NoPadding
PKCS5Padding
10+
ChaCha20NONE
Poly1305
NoPadding28+الگوریتم ChaCha با 20 راند، Nonce 96 بیت و Counter 32 بیت همانطور که در RFC 7539 تعریف شده است.
DESCBC
CFB
CTR
CTS
ECB
OFB
ISO10126Padding
NoPadding
PKCS5Padding
1+
DESedeCBC
CFB
CTR
CTS
ECB
OFB
ISO10126Padding
NoPadding
PKCS5Padding
1+
RSAECB
NONE
NoPadding
OAEPPadding
PKCS1Padding
1+
RSAECB
NONE
OAEPwithSHA-1andMGF1Padding
OAEPwithSHA-256andMGF1Padding
10+
RSAECB
NONE
OAEPwithSHA-224andMGF1Padding
OAEPwithSHA-384andMGF1Padding
OAEPwithSHA-512andMGF1Padding
23+

KeyAgreement

الگوریتمAPI پشتیبانی شده
DH1+
ECDH11+

KeyFactory

الگوریتمAPI پشتیبانی شده
DH1+
DSA1+
EC11+
RSA1+
X.5091-8

KeyGenerator

الگوریتمAPI پشتیبانی شده
AES1+
AESWRAP1-8
ARC414+
BLOWFISH10+
ChaCha2028+
DES1+
DESede1+
DESedeWRAP1-8
HmacMD51+
HmacSHA111+
HmacSHA2241-8 و 22+
HmacSHA2561+
HmacSHA3841+
HmacSHA5121+
RC410-13

KeyManagerFactory

الگوریتمAPI پشتیبانی شده
PKIX1+

KeyPairGenerator

الگوریتمAPI پشتیبانی شده
DH1+
DSA1+
EC11+
RSA1+

KeyStore

الگوریتمAPI پشتیبانی شده
AndroidCAStore14+
AndroidKeyStore18+
BCPKCS121-8
BKS1+
BouncyCastle1+
PKCS121+
PKCS12-DEF1-8

Mac

الگوریتمAPI پشتیبانی شده
DESMAC1-8
DESMAC/CFB81-8
DESedeMAC1-8
DESedeMAC/CFB81-8
DESedeMAC641-8
DESwithISO97971-8
HmacMD51+
HmacSHA11+
HmacSHA2241-8 و 22+
HmacSHA2561+
HmacSHA3841+
HmacSHA5121+
ISO9797ALG3MAC1-8
PBEwithHmacSHA1+
PBEwithHmacSHA11+
PBEwithHmacSHA22426+
PBEwithHmacSHA25626+
PBEwithHmacSHA38426+
PBEwithHmacSHA51226+

MessageDigest

الگوریتمAPI پشتیبانی شده
MD51+
SHA-11+
SHA-2241-8 و 22+
SHA-2561+
SHA-3841+
SHA-5121+

SSLContext

الگوریتمAPI پشتیبانی شده
Default10+
SSL10+
SSLv310-25
TLS1+
TLSv110+
TLSv1.116+
TLSv1.216+

SSLEngine

الگوریتمAPI پشتیبانی شدهفعال بصورت پیشفرض
SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA9-229-19
SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA9-229-19
SSL_DHE_DSS_WITH_DES_CBC_SHA9-229-19
SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA9-229-19
SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA9-229-19
SSL_DHE_RSA_WITH_DES_CBC_SHA9-229-19
SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA9-22
SSL_DH_anon_EXPORT_WITH_RC4_40_MD59-22
SSL_DH_anon_WITH_3DES_EDE_CBC_SHA9-22
SSL_DH_anon_WITH_DES_CBC_SHA9-22
SSL_DH_anon_WITH_RC4_128_MD59-22
SSL_RSA_EXPORT_WITH_DES40_CBC_SHA9-229-19
SSL_RSA_EXPORT_WITH_RC4_40_MD59-229-19
SSL_RSA_WITH_3DES_EDE_CBC_SHA9+9-19
SSL_RSA_WITH_DES_CBC_SHA9-229-19
SSL_RSA_WITH_NULL_MD59-22
SSL_RSA_WITH_NULL_SHA9-22
SSL_RSA_WITH_RC4_128_MD59-259-19
SSL_RSA_WITH_RC4_128_SHA9-259-23
TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA1-81-8
TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA1-81-8
TLS_DHE_DSS_WITH_AES_128_CBC_SHA9-229-22
TLS_DHE_DSS_WITH_AES_128_CBC_SHA25620-22
TLS_DHE_DSS_WITH_AES_128_GCM_SHA25620-22
TLS_DHE_DSS_WITH_AES_256_CBC_SHA9-2220-22
TLS_DHE_DSS_WITH_AES_256_CBC_SHA25620-22
TLS_DHE_DSS_WITH_AES_256_GCM_SHA38420-22
TLS_DHE_DSS_WITH_DES_CBC_SHA1-81-8
TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA1-81-8
TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA1-81-8
TLS_DHE_RSA_WITH_AES_128_CBC_SHA9-259-25
TLS_DHE_RSA_WITH_AES_128_CBC_SHA25620-25
TLS_DHE_RSA_WITH_AES_128_GCM_SHA25620-2520-25
TLS_DHE_RSA_WITH_AES_256_CBC_SHA9-2520-25
TLS_DHE_RSA_WITH_AES_256_CBC_SHA25620-25
TLS_DHE_RSA_WITH_AES_256_GCM_SHA38420-2520-25
TLS_DHE_RSA_WITH_DES_CBC_SHA1-81-8
TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA1-8
TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA1-8
TLS_DH_DSS_WITH_DES_CBC_SHA1-8
TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA1-8
TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA1-8
TLS_DH_RSA_WITH_DES_CBC_SHA1-8
TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA1-8
TLS_DH_anon_WITH_3DES_EDE_CBC_SHA1-8
TLS_DH_anon_WITH_AES_128_CBC_SHA9-22
TLS_DH_anon_WITH_AES_128_CBC_SHA25620-22
TLS_DH_anon_WITH_AES_128_GCM_SHA25620-22
TLS_DH_anon_WITH_AES_256_CBC_SHA9-22
TLS_DH_anon_WITH_AES_256_CBC_SHA25620-22
TLS_DH_anon_WITH_AES_256_GCM_SHA38420-22
TLS_DH_anon_WITH_DES_CBC_SHA1-8
TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA20-22
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA20+20+
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA25620+
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA25620+20+
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA20+20+
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA38420+
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA38420+20+
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA25624+24+
TLS_ECDHE_ECDSA_WITH_NULL_SHA20-22
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA20-2520-23
TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA21+21+
TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA21+21+
TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA25624+24+
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA20-22
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA20+20+
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA25620+
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA25620+20+
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA20+20+
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA38420+
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA38420+20+
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA25624+24+
TLS_ECDHE_RSA_WITH_NULL_SHA20-22
TLS_ECDHE_RSA_WITH_RC4_128_SHA20-2520-23
TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA20-22
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA20-22
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA25620-22
TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA25620-22
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA20-22
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA38420-22
TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA38420-22
TLS_ECDH_ECDSA_WITH_NULL_SHA20-22
TLS_ECDH_ECDSA_WITH_RC4_128_SHA20-22
TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA20-22
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA20-22
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA25620-22
TLS_ECDH_RSA_WITH_AES_128_GCM_SHA25620-22
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA20-22
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA38420-22
TLS_ECDH_RSA_WITH_AES_256_GCM_SHA38420-22
TLS_ECDH_RSA_WITH_NULL_SHA20-22
TLS_ECDH_RSA_WITH_RC4_128_SHA20-22
TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA20-22
TLS_ECDH_anon_WITH_AES_128_CBC_SHA20-22
TLS_ECDH_anon_WITH_AES_256_CBC_SHA20-22
TLS_ECDH_anon_WITH_NULL_SHA20-22
TLS_ECDH_anon_WITH_RC4_128_SHA20-22
TLS_EMPTY_RENEGOTIATION_INFO_SCSV20+20+
TLS_FALLBACK_SCSV21+
TLS_NULL_WITH_NULL_NULL1-8
TLS_PSK_WITH_3DES_EDE_CBC_SHA21-22
TLS_PSK_WITH_AES_128_CBC_SHA21+21+
TLS_PSK_WITH_AES_256_CBC_SHA21+21+
TLS_PSK_WITH_RC4_128_SHA21-25
TLS_RSA_EXPORT_WITH_DES40_CBC_SHA1-81-8
TLS_RSA_WITH_3DES_EDE_CBC_SHA1-81-8
TLS_RSA_WITH_AES_128_CBC_SHA9+9+
TLS_RSA_WITH_AES_128_CBC_SHA25620+
TLS_RSA_WITH_AES_128_GCM_SHA25620+20+
TLS_RSA_WITH_AES_256_CBC_SHA9+20+
TLS_RSA_WITH_AES_256_CBC_SHA25620+
TLS_RSA_WITH_AES_256_GCM_SHA38420+20+
TLS_RSA_WITH_DES_CBC_SHA1-81-8
TLS_RSA_WITH_NULL_MD51-8
TLS_RSA_WITH_NULL_SHA1-8
TLS_RSA_WITH_NULL_SHA25620-22

SSLSocket

الگوریتمAPI پشتیبانی شدهفعال بصورت پیشفرض
SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA9-229-19
SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA9-229-19
SSL_DHE_DSS_WITH_DES_CBC_SHA9-229-19
SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA9-229-19
SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA9-229-19
SSL_DHE_RSA_WITH_DES_CBC_SHA9-229-19
SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA9-22
SSL_DH_anon_EXPORT_WITH_RC4_40_MD59-22
SSL_DH_anon_WITH_3DES_EDE_CBC_SHA9-22
SSL_DH_anon_WITH_DES_CBC_SHA9-22
SSL_DH_anon_WITH_RC4_128_MD59-22
SSL_RSA_EXPORT_WITH_DES40_CBC_SHA9-229-19
SSL_RSA_EXPORT_WITH_RC4_40_MD59-229-19
SSL_RSA_WITH_3DES_EDE_CBC_SHA9+9-19
SSL_RSA_WITH_DES_CBC_SHA9-229-19
SSL_RSA_WITH_NULL_MD59-22
SSL_RSA_WITH_NULL_SHA9-22
SSL_RSA_WITH_RC4_128_MD59-259-19
SSL_RSA_WITH_RC4_128_SHA9-259-23
TLS_DHE_DSS_WITH_AES_128_CBC_SHA9-229-22
TLS_DHE_DSS_WITH_AES_128_CBC_SHA25620-22
TLS_DHE_DSS_WITH_AES_128_GCM_SHA25620-22
TLS_DHE_DSS_WITH_AES_256_CBC_SHA9-2211-22
TLS_DHE_DSS_WITH_AES_256_CBC_SHA25620-22
TLS_DHE_DSS_WITH_AES_256_GCM_SHA38420-22
TLS_DHE_RSA_WITH_AES_128_CBC_SHA9-259-25
TLS_DHE_RSA_WITH_AES_128_CBC_SHA25620-25
TLS_DHE_RSA_WITH_AES_128_GCM_SHA25620-2520-25
TLS_DHE_RSA_WITH_AES_256_CBC_SHA9-2511-25
TLS_DHE_RSA_WITH_AES_256_CBC_SHA25620-25
TLS_DHE_RSA_WITH_AES_256_GCM_SHA38420-2520-25
TLS_DH_anon_WITH_AES_128_CBC_SHA9-22
TLS_DH_anon_WITH_AES_128_CBC_SHA25620-22
TLS_DH_anon_WITH_AES_128_GCM_SHA25620-22
TLS_DH_anon_WITH_AES_256_CBC_SHA9-22
TLS_DH_anon_WITH_AES_256_CBC_SHA25620-22
TLS_DH_anon_WITH_AES_256_GCM_SHA38420-22
TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA11-22
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA11+
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA25620+
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA25620+11-19
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA11+11+
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA38420+
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA38420+20+
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA25624+24+
TLS_ECDHE_ECDSA_WITH_NULL_SHA11-22
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA11-2511-23
TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA21+21+
TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA21+21+
TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA25624+24+
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA11-2211-19
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA11+11+
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA25620+
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA25620+20+
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA11+11+
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA38420+
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA38420+20+
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA25624+24+
TLS_ECDHE_RSA_WITH_NULL_SHA11-22
TLS_ECDHE_RSA_WITH_RC4_128_SHA11-2511-23
TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA11-2211-19
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA11-2211-19
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA25620-22
TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA25620-22
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA11-2211-19
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA38420-22
TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA38420-22
TLS_ECDH_ECDSA_WITH_NULL_SHA11-22
TLS_ECDH_ECDSA_WITH_RC4_128_SHA11-2211-19
TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA11-2211-19
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA11-2211-19
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA25620-22
TLS_ECDH_RSA_WITH_AES_128_GCM_SHA25620-22
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA11-2211-19
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA38420-22
TLS_ECDH_RSA_WITH_AES_256_GCM_SHA38420-22
TLS_ECDH_RSA_WITH_NULL_SHA11-22
TLS_ECDH_RSA_WITH_RC4_128_SHA11-2211-19
TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA11-22
TLS_ECDH_anon_WITH_AES_128_CBC_SHA11-22
TLS_ECDH_anon_WITH_AES_256_CBC_SHA11-22
TLS_ECDH_anon_WITH_NULL_SHA11-22
TLS_ECDH_anon_WITH_RC4_128_SHA11-22
TLS_EMPTY_RENEGOTIATION_INFO_SCSV11+11+
TLS_FALLBACK_SCSV21+
TLS_PSK_WITH_3DES_EDE_CBC_SHA21-22
TLS_PSK_WITH_AES_128_CBC_SHA21+21+
TLS_PSK_WITH_AES_256_CBC_SHA21+21+
TLS_PSK_WITH_RC4_128_SHA21-25
TLS_RSA_WITH_AES_128_CBC_SHA9+9+
TLS_RSA_WITH_AES_128_CBC_SHA25620+
TLS_RSA_WITH_AES_128_GCM_SHA25620+20+
TLS_RSA_WITH_AES_256_CBC_SHA9+11+
TLS_RSA_WITH_AES_256_CBC_SHA25620+
TLS_RSA_WITH_AES_256_GCM_SHA38420+20+
TLS_RSA_WITH_NULL_SHA25620-22

SecretKeyFactory

الگوریتمAPI پشتیبانی شده
AES23+
DES1+
DESede1+
HmacSHA123+
HmacSHA22423+
HmacSHA25623+
HmacSHA38423+
HmacSHA51223+
PBEwithHmacSHA11+
PBEwithHmacSHA1AndAES_12826+
PBEwithHmacSHA1AndAES_25626+
PBEwithHmacSHA224AndAES_12826+
PBEwithHmacSHA224AndAES_25626+
PBEwithHmacSHA256AndAES_12826+
PBEwithHmacSHA256AndAES_25626+
PBEwithHmacSHA384AndAES_12826+
PBEwithHmacSHA384AndAES_25626+
PBEwithHmacSHA512AndAES_12826+
PBEwithHmacSHA512AndAES_25626+
PBEwithMD5AND128BITAES-CBC-OPENSSL1+
PBEwithMD5AND192BITAES-CBC-OPENSSL1+
PBEwithMD5AND256BITAES-CBC-OPENSSL1+
PBEwithMD5ANDDES1+
PBEwithMD5ANDRC21+
PBEwithSHA1ANDDES1+
PBEwithSHA1ANDRC21+
PBEwithSHA256AND128BITAES-CBC-BC1+
PBEwithSHA256AND192BITAES-CBC-BC1+
PBEwithSHA256AND256BITAES-CBC-BC1+
PBEwithSHAAND128BITAES-CBC-BC1+
PBEwithSHAAND128BITRC2-CBC10+
PBEwithSHAAND128BITRC410+
PBEwithSHAAND192BITAES-CBC-BC1+
PBEwithSHAAND2-KEYTRIPLEDES-CBC1+
PBEwithSHAAND256BITAES-CBC-BC1+
PBEwithSHAAND3-KEYTRIPLEDES-CBC1+
PBEwithSHAAND40BITRC2-CBC1+
PBEwithSHAAND40BITRC410+
PBEwithSHAANDTWOFISH-CBC10+
PBKDF2withHmacSHA110+
PBKDF2withHmacSHA1And8BIT19+
PBKDF2withHmacSHA22426+
PBKDF2withHmacSHA25626+
PBKDF2withHmacSHA38426+
PBKDF2withHmacSHA51226+

SecureRandom

الگوریتمAPI پشتیبانی شده
SHA1PRNG1+

Signature

الگوریتمAPI پشتیبانی شده
DSA1+
DSAwithSHA11+
DSS1-19
ECDSA11+
ECDSAwithSHA111+
MD2withRSA1-3
MD4withRSA1-8
MD5withRSA1+
MD5withRSA/ISO9796-21-8
NONEwithDSA1+
NONEwithECDSA11+
NONEwithRSA17+
RSASSA-PSS1-8
SHA1withDSA1+
SHA1withECDSA11+
SHA1withRSA1+
SHA1withRSA/ISO9796-21-8
SHA1withRSA/PSS23+
SHA224withDSA20+
SHA224withECDSA20+
SHA224withRSA20+
SHA224withRSA/PSS23+
SHA256withDSA1+
SHA256withECDSA11+
SHA256withRSA1+
SHA256withRSA/PSS23+
SHA384withECDSA11+
SHA384withRSA1+
SHA384withRSA/PSS23+
SHA512withECDSA11+
SHA512withRSA1+
SHA512withRSA/PSS23+

TrustManagerFactory

الگوریتمAPI پشتیبانی شده
PKIX1+

منابع بیشتر برای مطالعه

میتوانید از منابع زیر برای مطالعه بیشتر درباره کریپتوگرافی در اندروید استفاده کنید:

درباره نویسنده

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

اسکرول به بالا