کریپتوگرافی نقش بسیار مهمی در امنیت داده های کاربران بازی میکنند. این مسئله روی گوشی های موبایل اهمیت بیشتری دارد زیرا حمله کننده ها ممکن است بصورت فیزیکی به دستگاه کاربر دسترسی داشته باشند. در این مقاله از بلاگ برنامه چی نحوه استفاده درست از کریپتوگرافی در اندروید و همچنین مثال هایی کاربردی از آن صحبت میکنیم. البته اگر نیاز به سطح بالاتری از امنیت برای اپلیکیشن خودتان دارید، میتوانید از سیستم 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
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 کنید، ممکن است در آینده و بعد از منتشر شدن نسخه های بعدی اندروید با مشکلات زیادی روبرو شوید.
انتخاب یک الگوریتم مناسب
وقتی برای انتخاب الگوریتم های کریپتوگرافی دستتان باز باشد (یعنی مثلا نیاز نداشته باشید با یک سیستم دیگر سازگاری پیدا کنید)َ، میتوانید از الگوریتم های پیشنهاد شده زیر استفاده کنید.
کلاس | پیشنهاد |
---|---|
Cipher | AES در یکی از مود های CBC یا GCM با کلید 256 بیتی (مانند AES/GCM/NoPadding) |
MessageDigest | خانواده SHA-2 (مثلا SHA-256) |
Mac | HMAC خانواده 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 پشتیبانی شده |
---|---|
AES | 1-8 |
DES | 1-8 |
DESede | 1-8 |
DH | 1+ |
DSA | 1+ |
AlgorithmParameters
الگوریتم | API پشتیبانی شده |
---|---|
AES | 1+ |
BLOWFISH | 10+ |
ChaCha20 | 28+ |
DES | 1+ |
DESede | 1+ |
DH | 1+ |
DSA | 1+ |
EC | 26+ |
GCM | 22+ |
IES | 1-8 |
OAEP | 1+ |
PBEwithHmacSHA1AndAES_128 | 26+ |
PBEwithHmacSHA1AndAES_256 | 26+ |
PBEwithHmacSHA224AndAES_128 | 26+ |
PBEwithHmacSHA224AndAES_256 | 26+ |
PBEwithHmacSHA256AndAES_128 | 26+ |
PBEwithHmacSHA256AndAES_256 | 26+ |
PBEwithHmacSHA384AndAES_128 | 26+ |
PBEwithHmacSHA384AndAES_256 | 26+ |
PBEwithHmacSHA512AndAES_128 | 26+ |
PKCS12PBE | 1+ |
PSS | 1-8,24+ |
CertPathBuilder
الگوریتم | API پشتیبانی شده |
---|---|
PKIX | 1+ |
CertPathValidator
الگوریتم | API پشتیبانی شده |
---|---|
PKIX | 1+ |
CertStore
الگوریتم | API پشتیبانی شده |
---|---|
Collection | 1+ |
CertificateFactory
الگوریتم | API پشتیبانی شده |
---|---|
X.509 | 1+ |
Cipher
الگوریتم | مود ها | Paddings | API پشتیبانی شده | نکته |
---|---|---|---|---|
AES | CBC CFB CTR CTS ECB OFB | ISO10126Padding NoPadding PKCS5Padding | 1+ | |
AES | GCM | NoPadding | 10+ | |
AES_128 | CBC ECB | NoPadding PKCS5Padding | 26+ | |
AES_128 | GCM | NoPadding | 26+ | |
AES_256 | CBC ECB | NoPadding PKCS5Padding | 26+ | |
AES_256 | GCM | NoPadding | 26+ | |
ARC4 | ECB | NoPadding | 10+ | |
ARC4 | NONE | NoPadding | 28+ | |
BLOWFISH | CBC CFB CTR CTS ECB OFB | ISO10126Padding NoPadding PKCS5Padding | 10+ | |
ChaCha20 | NONE Poly1305 | NoPadding | 28+ | الگوریتم ChaCha با 20 راند، Nonce 96 بیت و Counter 32 بیت همانطور که در RFC 7539 تعریف شده است. |
DES | CBC CFB CTR CTS ECB OFB | ISO10126Padding NoPadding PKCS5Padding | 1+ | |
DESede | CBC CFB CTR CTS ECB OFB | ISO10126Padding NoPadding PKCS5Padding | 1+ | |
RSA | ECB NONE | NoPadding OAEPPadding PKCS1Padding | 1+ | |
RSA | ECB NONE | OAEPwithSHA-1andMGF1Padding OAEPwithSHA-256andMGF1Padding | 10+ | |
RSA | ECB NONE | OAEPwithSHA-224andMGF1Padding OAEPwithSHA-384andMGF1Padding OAEPwithSHA-512andMGF1Padding | 23+ |
KeyAgreement
الگوریتم | API پشتیبانی شده |
---|---|
DH | 1+ |
ECDH | 11+ |
KeyFactory
الگوریتم | API پشتیبانی شده |
---|---|
DH | 1+ |
DSA | 1+ |
EC | 11+ |
RSA | 1+ |
X.509 | 1-8 |
KeyGenerator
الگوریتم | API پشتیبانی شده |
---|---|
AES | 1+ |
AESWRAP | 1-8 |
ARC4 | 14+ |
BLOWFISH | 10+ |
ChaCha20 | 28+ |
DES | 1+ |
DESede | 1+ |
DESedeWRAP | 1-8 |
HmacMD5 | 1+ |
HmacSHA1 | 11+ |
HmacSHA224 | 1-8 و 22+ |
HmacSHA256 | 1+ |
HmacSHA384 | 1+ |
HmacSHA512 | 1+ |
RC4 | 10-13 |
KeyManagerFactory
الگوریتم | API پشتیبانی شده |
---|---|
PKIX | 1+ |
KeyPairGenerator
الگوریتم | API پشتیبانی شده |
---|---|
DH | 1+ |
DSA | 1+ |
EC | 11+ |
RSA | 1+ |
KeyStore
الگوریتم | API پشتیبانی شده |
---|---|
AndroidCAStore | 14+ |
AndroidKeyStore | 18+ |
BCPKCS12 | 1-8 |
BKS | 1+ |
BouncyCastle | 1+ |
PKCS12 | 1+ |
PKCS12-DEF | 1-8 |
Mac
الگوریتم | API پشتیبانی شده |
---|---|
DESMAC | 1-8 |
DESMAC/CFB8 | 1-8 |
DESedeMAC | 1-8 |
DESedeMAC/CFB8 | 1-8 |
DESedeMAC64 | 1-8 |
DESwithISO9797 | 1-8 |
HmacMD5 | 1+ |
HmacSHA1 | 1+ |
HmacSHA224 | 1-8 و 22+ |
HmacSHA256 | 1+ |
HmacSHA384 | 1+ |
HmacSHA512 | 1+ |
ISO9797ALG3MAC | 1-8 |
PBEwithHmacSHA | 1+ |
PBEwithHmacSHA1 | 1+ |
PBEwithHmacSHA224 | 26+ |
PBEwithHmacSHA256 | 26+ |
PBEwithHmacSHA384 | 26+ |
PBEwithHmacSHA512 | 26+ |
MessageDigest
الگوریتم | API پشتیبانی شده |
---|---|
MD5 | 1+ |
SHA-1 | 1+ |
SHA-224 | 1-8 و 22+ |
SHA-256 | 1+ |
SHA-384 | 1+ |
SHA-512 | 1+ |
SSLContext
الگوریتم | API پشتیبانی شده |
---|---|
Default | 10+ |
SSL | 10+ |
SSLv3 | 10-25 |
TLS | 1+ |
TLSv1 | 10+ |
TLSv1.1 | 16+ |
TLSv1.2 | 16+ |
SSLEngine
الگوریتم | API پشتیبانی شده | فعال بصورت پیشفرض |
---|---|---|
SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA | 9-22 | 9-19 |
SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA | 9-22 | 9-19 |
SSL_DHE_DSS_WITH_DES_CBC_SHA | 9-22 | 9-19 |
SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA | 9-22 | 9-19 |
SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA | 9-22 | 9-19 |
SSL_DHE_RSA_WITH_DES_CBC_SHA | 9-22 | 9-19 |
SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA | 9-22 | |
SSL_DH_anon_EXPORT_WITH_RC4_40_MD5 | 9-22 | |
SSL_DH_anon_WITH_3DES_EDE_CBC_SHA | 9-22 | |
SSL_DH_anon_WITH_DES_CBC_SHA | 9-22 | |
SSL_DH_anon_WITH_RC4_128_MD5 | 9-22 | |
SSL_RSA_EXPORT_WITH_DES40_CBC_SHA | 9-22 | 9-19 |
SSL_RSA_EXPORT_WITH_RC4_40_MD5 | 9-22 | 9-19 |
SSL_RSA_WITH_3DES_EDE_CBC_SHA | 9+ | 9-19 |
SSL_RSA_WITH_DES_CBC_SHA | 9-22 | 9-19 |
SSL_RSA_WITH_NULL_MD5 | 9-22 | |
SSL_RSA_WITH_NULL_SHA | 9-22 | |
SSL_RSA_WITH_RC4_128_MD5 | 9-25 | 9-19 |
SSL_RSA_WITH_RC4_128_SHA | 9-25 | 9-23 |
TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA | 1-8 | 1-8 |
TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA | 1-8 | 1-8 |
TLS_DHE_DSS_WITH_AES_128_CBC_SHA | 9-22 | 9-22 |
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 | 20-22 | |
TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 | 20-22 | |
TLS_DHE_DSS_WITH_AES_256_CBC_SHA | 9-22 | 20-22 |
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 | 20-22 | |
TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 | 20-22 | |
TLS_DHE_DSS_WITH_DES_CBC_SHA | 1-8 | 1-8 |
TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA | 1-8 | 1-8 |
TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA | 1-8 | 1-8 |
TLS_DHE_RSA_WITH_AES_128_CBC_SHA | 9-25 | 9-25 |
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 | 20-25 | |
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 | 20-25 | 20-25 |
TLS_DHE_RSA_WITH_AES_256_CBC_SHA | 9-25 | 20-25 |
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 | 20-25 | |
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 | 20-25 | 20-25 |
TLS_DHE_RSA_WITH_DES_CBC_SHA | 1-8 | 1-8 |
TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA | 1-8 | |
TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA | 1-8 | |
TLS_DH_DSS_WITH_DES_CBC_SHA | 1-8 | |
TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA | 1-8 | |
TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA | 1-8 | |
TLS_DH_RSA_WITH_DES_CBC_SHA | 1-8 | |
TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA | 1-8 | |
TLS_DH_anon_WITH_3DES_EDE_CBC_SHA | 1-8 | |
TLS_DH_anon_WITH_AES_128_CBC_SHA | 9-22 | |
TLS_DH_anon_WITH_AES_128_CBC_SHA256 | 20-22 | |
TLS_DH_anon_WITH_AES_128_GCM_SHA256 | 20-22 | |
TLS_DH_anon_WITH_AES_256_CBC_SHA | 9-22 | |
TLS_DH_anon_WITH_AES_256_CBC_SHA256 | 20-22 | |
TLS_DH_anon_WITH_AES_256_GCM_SHA384 | 20-22 | |
TLS_DH_anon_WITH_DES_CBC_SHA | 1-8 | |
TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA | 20-22 | |
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA | 20+ | 20+ |
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 | 20+ | |
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 | 20+ | 20+ |
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA | 20+ | 20+ |
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 | 20+ | |
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 | 20+ | 20+ |
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 | 24+ | 24+ |
TLS_ECDHE_ECDSA_WITH_NULL_SHA | 20-22 | |
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA | 20-25 | 20-23 |
TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA | 21+ | 21+ |
TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA | 21+ | 21+ |
TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 | 24+ | 24+ |
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA | 20-22 | |
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA | 20+ | 20+ |
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 | 20+ | |
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | 20+ | 20+ |
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA | 20+ | 20+ |
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 | 20+ | |
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 | 20+ | 20+ |
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 | 24+ | 24+ |
TLS_ECDHE_RSA_WITH_NULL_SHA | 20-22 | |
TLS_ECDHE_RSA_WITH_RC4_128_SHA | 20-25 | 20-23 |
TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA | 20-22 | |
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA | 20-22 | |
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 | 20-22 | |
TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 | 20-22 | |
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA | 20-22 | |
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 | 20-22 | |
TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 | 20-22 | |
TLS_ECDH_ECDSA_WITH_NULL_SHA | 20-22 | |
TLS_ECDH_ECDSA_WITH_RC4_128_SHA | 20-22 | |
TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA | 20-22 | |
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA | 20-22 | |
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 | 20-22 | |
TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 | 20-22 | |
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA | 20-22 | |
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 | 20-22 | |
TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 | 20-22 | |
TLS_ECDH_RSA_WITH_NULL_SHA | 20-22 | |
TLS_ECDH_RSA_WITH_RC4_128_SHA | 20-22 | |
TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA | 20-22 | |
TLS_ECDH_anon_WITH_AES_128_CBC_SHA | 20-22 | |
TLS_ECDH_anon_WITH_AES_256_CBC_SHA | 20-22 | |
TLS_ECDH_anon_WITH_NULL_SHA | 20-22 | |
TLS_ECDH_anon_WITH_RC4_128_SHA | 20-22 | |
TLS_EMPTY_RENEGOTIATION_INFO_SCSV | 20+ | 20+ |
TLS_FALLBACK_SCSV | 21+ | |
TLS_NULL_WITH_NULL_NULL | 1-8 | |
TLS_PSK_WITH_3DES_EDE_CBC_SHA | 21-22 | |
TLS_PSK_WITH_AES_128_CBC_SHA | 21+ | 21+ |
TLS_PSK_WITH_AES_256_CBC_SHA | 21+ | 21+ |
TLS_PSK_WITH_RC4_128_SHA | 21-25 | |
TLS_RSA_EXPORT_WITH_DES40_CBC_SHA | 1-8 | 1-8 |
TLS_RSA_WITH_3DES_EDE_CBC_SHA | 1-8 | 1-8 |
TLS_RSA_WITH_AES_128_CBC_SHA | 9+ | 9+ |
TLS_RSA_WITH_AES_128_CBC_SHA256 | 20+ | |
TLS_RSA_WITH_AES_128_GCM_SHA256 | 20+ | 20+ |
TLS_RSA_WITH_AES_256_CBC_SHA | 9+ | 20+ |
TLS_RSA_WITH_AES_256_CBC_SHA256 | 20+ | |
TLS_RSA_WITH_AES_256_GCM_SHA384 | 20+ | 20+ |
TLS_RSA_WITH_DES_CBC_SHA | 1-8 | 1-8 |
TLS_RSA_WITH_NULL_MD5 | 1-8 | |
TLS_RSA_WITH_NULL_SHA | 1-8 | |
TLS_RSA_WITH_NULL_SHA256 | 20-22 |
SSLSocket
الگوریتم | API پشتیبانی شده | فعال بصورت پیشفرض |
---|---|---|
SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA | 9-22 | 9-19 |
SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA | 9-22 | 9-19 |
SSL_DHE_DSS_WITH_DES_CBC_SHA | 9-22 | 9-19 |
SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA | 9-22 | 9-19 |
SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA | 9-22 | 9-19 |
SSL_DHE_RSA_WITH_DES_CBC_SHA | 9-22 | 9-19 |
SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA | 9-22 | |
SSL_DH_anon_EXPORT_WITH_RC4_40_MD5 | 9-22 | |
SSL_DH_anon_WITH_3DES_EDE_CBC_SHA | 9-22 | |
SSL_DH_anon_WITH_DES_CBC_SHA | 9-22 | |
SSL_DH_anon_WITH_RC4_128_MD5 | 9-22 | |
SSL_RSA_EXPORT_WITH_DES40_CBC_SHA | 9-22 | 9-19 |
SSL_RSA_EXPORT_WITH_RC4_40_MD5 | 9-22 | 9-19 |
SSL_RSA_WITH_3DES_EDE_CBC_SHA | 9+ | 9-19 |
SSL_RSA_WITH_DES_CBC_SHA | 9-22 | 9-19 |
SSL_RSA_WITH_NULL_MD5 | 9-22 | |
SSL_RSA_WITH_NULL_SHA | 9-22 | |
SSL_RSA_WITH_RC4_128_MD5 | 9-25 | 9-19 |
SSL_RSA_WITH_RC4_128_SHA | 9-25 | 9-23 |
TLS_DHE_DSS_WITH_AES_128_CBC_SHA | 9-22 | 9-22 |
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 | 20-22 | |
TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 | 20-22 | |
TLS_DHE_DSS_WITH_AES_256_CBC_SHA | 9-22 | 11-22 |
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 | 20-22 | |
TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 | 20-22 | |
TLS_DHE_RSA_WITH_AES_128_CBC_SHA | 9-25 | 9-25 |
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 | 20-25 | |
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 | 20-25 | 20-25 |
TLS_DHE_RSA_WITH_AES_256_CBC_SHA | 9-25 | 11-25 |
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 | 20-25 | |
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 | 20-25 | 20-25 |
TLS_DH_anon_WITH_AES_128_CBC_SHA | 9-22 | |
TLS_DH_anon_WITH_AES_128_CBC_SHA256 | 20-22 | |
TLS_DH_anon_WITH_AES_128_GCM_SHA256 | 20-22 | |
TLS_DH_anon_WITH_AES_256_CBC_SHA | 9-22 | |
TLS_DH_anon_WITH_AES_256_CBC_SHA256 | 20-22 | |
TLS_DH_anon_WITH_AES_256_GCM_SHA384 | 20-22 | |
TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA | 11-22 | |
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA | 11+ | |
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 | 20+ | |
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 | 20+ | 11-19 |
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA | 11+ | 11+ |
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 | 20+ | |
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 | 20+ | 20+ |
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 | 24+ | 24+ |
TLS_ECDHE_ECDSA_WITH_NULL_SHA | 11-22 | |
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA | 11-25 | 11-23 |
TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA | 21+ | 21+ |
TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA | 21+ | 21+ |
TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 | 24+ | 24+ |
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA | 11-22 | 11-19 |
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA | 11+ | 11+ |
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 | 20+ | |
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | 20+ | 20+ |
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA | 11+ | 11+ |
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 | 20+ | |
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 | 20+ | 20+ |
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 | 24+ | 24+ |
TLS_ECDHE_RSA_WITH_NULL_SHA | 11-22 | |
TLS_ECDHE_RSA_WITH_RC4_128_SHA | 11-25 | 11-23 |
TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA | 11-22 | 11-19 |
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA | 11-22 | 11-19 |
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 | 20-22 | |
TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 | 20-22 | |
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA | 11-22 | 11-19 |
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 | 20-22 | |
TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 | 20-22 | |
TLS_ECDH_ECDSA_WITH_NULL_SHA | 11-22 | |
TLS_ECDH_ECDSA_WITH_RC4_128_SHA | 11-22 | 11-19 |
TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA | 11-22 | 11-19 |
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA | 11-22 | 11-19 |
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 | 20-22 | |
TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 | 20-22 | |
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA | 11-22 | 11-19 |
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 | 20-22 | |
TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 | 20-22 | |
TLS_ECDH_RSA_WITH_NULL_SHA | 11-22 | |
TLS_ECDH_RSA_WITH_RC4_128_SHA | 11-22 | 11-19 |
TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA | 11-22 | |
TLS_ECDH_anon_WITH_AES_128_CBC_SHA | 11-22 | |
TLS_ECDH_anon_WITH_AES_256_CBC_SHA | 11-22 | |
TLS_ECDH_anon_WITH_NULL_SHA | 11-22 | |
TLS_ECDH_anon_WITH_RC4_128_SHA | 11-22 | |
TLS_EMPTY_RENEGOTIATION_INFO_SCSV | 11+ | 11+ |
TLS_FALLBACK_SCSV | 21+ | |
TLS_PSK_WITH_3DES_EDE_CBC_SHA | 21-22 | |
TLS_PSK_WITH_AES_128_CBC_SHA | 21+ | 21+ |
TLS_PSK_WITH_AES_256_CBC_SHA | 21+ | 21+ |
TLS_PSK_WITH_RC4_128_SHA | 21-25 | |
TLS_RSA_WITH_AES_128_CBC_SHA | 9+ | 9+ |
TLS_RSA_WITH_AES_128_CBC_SHA256 | 20+ | |
TLS_RSA_WITH_AES_128_GCM_SHA256 | 20+ | 20+ |
TLS_RSA_WITH_AES_256_CBC_SHA | 9+ | 11+ |
TLS_RSA_WITH_AES_256_CBC_SHA256 | 20+ | |
TLS_RSA_WITH_AES_256_GCM_SHA384 | 20+ | 20+ |
TLS_RSA_WITH_NULL_SHA256 | 20-22 |
SecretKeyFactory
الگوریتم | API پشتیبانی شده |
---|---|
AES | 23+ |
DES | 1+ |
DESede | 1+ |
HmacSHA1 | 23+ |
HmacSHA224 | 23+ |
HmacSHA256 | 23+ |
HmacSHA384 | 23+ |
HmacSHA512 | 23+ |
PBEwithHmacSHA1 | 1+ |
PBEwithHmacSHA1AndAES_128 | 26+ |
PBEwithHmacSHA1AndAES_256 | 26+ |
PBEwithHmacSHA224AndAES_128 | 26+ |
PBEwithHmacSHA224AndAES_256 | 26+ |
PBEwithHmacSHA256AndAES_128 | 26+ |
PBEwithHmacSHA256AndAES_256 | 26+ |
PBEwithHmacSHA384AndAES_128 | 26+ |
PBEwithHmacSHA384AndAES_256 | 26+ |
PBEwithHmacSHA512AndAES_128 | 26+ |
PBEwithHmacSHA512AndAES_256 | 26+ |
PBEwithMD5AND128BITAES-CBC-OPENSSL | 1+ |
PBEwithMD5AND192BITAES-CBC-OPENSSL | 1+ |
PBEwithMD5AND256BITAES-CBC-OPENSSL | 1+ |
PBEwithMD5ANDDES | 1+ |
PBEwithMD5ANDRC2 | 1+ |
PBEwithSHA1ANDDES | 1+ |
PBEwithSHA1ANDRC2 | 1+ |
PBEwithSHA256AND128BITAES-CBC-BC | 1+ |
PBEwithSHA256AND192BITAES-CBC-BC | 1+ |
PBEwithSHA256AND256BITAES-CBC-BC | 1+ |
PBEwithSHAAND128BITAES-CBC-BC | 1+ |
PBEwithSHAAND128BITRC2-CBC | 10+ |
PBEwithSHAAND128BITRC4 | 10+ |
PBEwithSHAAND192BITAES-CBC-BC | 1+ |
PBEwithSHAAND2-KEYTRIPLEDES-CBC | 1+ |
PBEwithSHAAND256BITAES-CBC-BC | 1+ |
PBEwithSHAAND3-KEYTRIPLEDES-CBC | 1+ |
PBEwithSHAAND40BITRC2-CBC | 1+ |
PBEwithSHAAND40BITRC4 | 10+ |
PBEwithSHAANDTWOFISH-CBC | 10+ |
PBKDF2withHmacSHA1 | 10+ |
PBKDF2withHmacSHA1And8BIT | 19+ |
PBKDF2withHmacSHA224 | 26+ |
PBKDF2withHmacSHA256 | 26+ |
PBKDF2withHmacSHA384 | 26+ |
PBKDF2withHmacSHA512 | 26+ |
SecureRandom
الگوریتم | API پشتیبانی شده |
---|---|
SHA1PRNG | 1+ |
Signature
الگوریتم | API پشتیبانی شده |
---|---|
DSA | 1+ |
DSAwithSHA1 | 1+ |
DSS | 1-19 |
ECDSA | 11+ |
ECDSAwithSHA1 | 11+ |
MD2withRSA | 1-3 |
MD4withRSA | 1-8 |
MD5withRSA | 1+ |
MD5withRSA/ISO9796-2 | 1-8 |
NONEwithDSA | 1+ |
NONEwithECDSA | 11+ |
NONEwithRSA | 17+ |
RSASSA-PSS | 1-8 |
SHA1withDSA | 1+ |
SHA1withECDSA | 11+ |
SHA1withRSA | 1+ |
SHA1withRSA/ISO9796-2 | 1-8 |
SHA1withRSA/PSS | 23+ |
SHA224withDSA | 20+ |
SHA224withECDSA | 20+ |
SHA224withRSA | 20+ |
SHA224withRSA/PSS | 23+ |
SHA256withDSA | 1+ |
SHA256withECDSA | 11+ |
SHA256withRSA | 1+ |
SHA256withRSA/PSS | 23+ |
SHA384withECDSA | 11+ |
SHA384withRSA | 1+ |
SHA384withRSA/PSS | 23+ |
SHA512withECDSA | 11+ |
SHA512withRSA | 1+ |
SHA512withRSA/PSS | 23+ |
TrustManagerFactory
الگوریتم | API پشتیبانی شده |
---|---|
PKIX | 1+ |
منابع بیشتر برای مطالعه
میتوانید از منابع زیر برای مطالعه بیشتر درباره کریپتوگرافی در اندروید استفاده کنید: