رفتن به مطلب
انجمن اندروید ایران | آموزش برنامه نویسی اندروید و موبایل
  • android.png.1fab383bc8500cd93127cebc65b1dcab.png

پست های پیشنهاد شده

با سلام

در این تاپیک  با نحویه کد و دیکد کردن  اطلاعات بین اندروید وسرور آشنا میشوید و میتوانید اطلاعات رو به صورت امن بین کلاینت و سرور رد و بدل کنید.

 

اول این کلاس   php  را به سرور اضافه کنید

<?php 

        class MCrypt
        {
                private $iv = 'fedcba9876543210'; #Same as in JAVA
                private $key = '0123456789abcdef'; #Same as in JAVA


                function __construct()
                {
                }

                function encrypt($str) {

                  //$key = $this->hex2bin($key);    
                  $iv = $this->iv;

                  $td = mcrypt_module_open('rijndael-128', '', 'cbc', $iv);

                  mcrypt_generic_init($td, $this->key, $iv);
                  $encrypted = mcrypt_generic($td, $str);

                  mcrypt_generic_deinit($td);
                  mcrypt_module_close($td);

                  return bin2hex($encrypted);
                }

                function decrypt($code) {
                  //$key = $this->hex2bin($key);
                  $code = $this->hex2bin($code);
                  $iv = $this->iv;

                  $td = mcrypt_module_open('rijndael-128', '', 'cbc', $iv);

                  mcrypt_generic_init($td, $this->key, $iv);
                  $decrypted = mdecrypt_generic($td, $code);

                  mcrypt_generic_deinit($td);
                  mcrypt_module_close($td);

                  return utf8_encode(trim($decrypted));
                }

                protected function hex2bin($hexdata) {
                  $bindata = '';

                  for ($i = 0; $i < strlen($hexdata); $i += 2) {
                        $bindata .= chr(hexdec(substr($hexdata, $i, 2)));
                  }

                  return $bindata;
                }

        }

 

و  بعد از اون  این کلاس جاوا رو به پروژه  خودتون اضافه کنید

 

import java.security.NoSuchAlgorithmException;

        import javax.crypto.Cipher;
        import javax.crypto.NoSuchPaddingException;
        import javax.crypto.spec.IvParameterSpec;
        import javax.crypto.spec.SecretKeySpec;

        public class MCrypt {

                private String iv = "fedcba9876543210";//Dummy iv (CHANGE IT!)
                private IvParameterSpec ivspec;
                private SecretKeySpec keyspec;
                private Cipher cipher;
                
                private String SecretKey = "0123456789abcdef";//Dummy secretKey (CHANGE IT!)
                
                public MCrypt()
                {
                        ivspec = new IvParameterSpec(iv.getBytes());

                        keyspec = new SecretKeySpec(SecretKey.getBytes(), "AES");
                        
                        try {
                                cipher = Cipher.getInstance("AES/CBC/NoPadding");
                        } catch (NoSuchAlgorithmException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        } catch (NoSuchPaddingException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
                
                public byte[] encrypt(String text) throws Exception
                {
                        if(text == null || text.length() == 0)
                                throw new Exception("Empty string");
                        
                        byte[] encrypted = null;

                        try {
                                cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);

                                encrypted = cipher.doFinal(padString(text).getBytes());
                        } catch (Exception e)
                        {                       
                                throw new Exception("[encrypt] " + e.getMessage());
                        }
                        
                        return encrypted;
                }
                
                public byte[] decrypt(String code) throws Exception
                {
                        if(code == null || code.length() == 0)
                                throw new Exception("Empty string");
                        
                        byte[] decrypted = null;

                        try {
                                cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
                                
                                decrypted = cipher.doFinal(hexToBytes(code));
                        } catch (Exception e)
                        {
                                throw new Exception("[decrypt] " + e.getMessage());
                        }
                        return decrypted;
                }
                

                
                public static String bytesToHex(byte[] data)
                {
                        if (data==null)
                        {
                                return null;
                        }
                        
                        int len = data.length;
                        String str = "";
                        for (int i=0; i<len; i++) {
                                if ((data[i]&0xFF)<16)
                                        str = str + "0" + java.lang.Integer.toHexString(data[i]&0xFF);
                                else
                                        str = str + java.lang.Integer.toHexString(data[i]&0xFF);
                        }
                        return str;
                }
                
                        
                public static byte[] hexToBytes(String str) {
                        if (str==null) {
                                return null;
                        } else if (str.length() < 2) {
                                return null;
                        } else {
                                int len = str.length() / 2;
                                byte[] buffer = new byte[len];
                                for (int i=0; i<len; i++) {
                                        buffer[i] = (byte) Integer.parseInt(str.substring(i*2,i*2+2),16);
                                }
                                return buffer;
                        }
                }
                
                

                private static String padString(String source)
                {
                  char paddingChar = ' ';
                  int size = 16;
                  int x = source.length() % size;
                  int padLength = size - x;

                  for (int i = 0; i < padLength; i++)
                  {
                          source += paddingChar;
                  }

                  return source;
                }
        }

 

 

حا الا که کلاس های بالا رو به پروژه و سرور اضافه کردید نوبت میرسه به رد بدل کردن اطلاعات میشه

برای وارد کردن  کلاس php  به فایل های php  از include استفاده کنید به این صورت توجه کنید که لاس در کنار فایل ها باید باشه  و گر نه باید مسیر کامل رو هم بدید

include('myclass.php');

توی دو کلاس دو متغییر  وجود دارند که باید در هر دو کلاس متغییر (دو متغییر در جاوا و دوتا در سمت سرور ) شبیه به هم باشند و گر نه  شناسای مقادیر کد شده  مشکل و  عملا  دیکد نمیشوند

این متغییر ها قدرت کد شدن داده رو افزایش می دهند

متغییر ها در جاوا

  private String iv = "fedcba9876543210";//Dummy iv (CHANGE IT!)

 private String SecretKey = "0123456789abcdef";//Dummy secretKey (CHANGE IT!)

متغییر ها در سمت php

private $iv = 'fedcba9876543210'; #Same as in JAVA
 private $key = '0123456789abcdef'; #Same as in JAVA

 

خب کد و دیکد کردن مقدار در جاوا رو به این صورت تعریف میکنیم

اول میای یک شیئ  از کلاس ایجاد میکنیم

mcrypt = new MCrypt();

اول کد اطلاعات رو  کد میکنیم

بعد مقادیر رو به صورت bytesToHex  در یک متغییر قرار میدیم و بعد به وسیله encrypt مقدار رو کد میکنیم  (این مقدار کد شده هستش)

String encrypted = MCrypt.bytesToHex( mcrypt.encrypt("Text to Encrypt") );

برای دیکد کردن  کافیه متغیر رو به درون تابع decrypt قرار بدیم

String decrypted = new String( mcrypt.decrypt( encrypted ) );

کا ما در سمت اندروید تموم شد و  مقدار کد و دیکد کردیم

 

کد های تکمیلی جاوا

mcrypt = new MCrypt();
/* Encrypt */
String encrypted = MCrypt.bytesToHex( mcrypt.encrypt("Text to Encrypt") );
/* Decrypt */
String decrypted = new String( mcrypt.decrypt( encrypted ) );

خب حالا سمت php باز میایم یک شیئ ایجاد میکنیم

$mcrypt = new MCrypt();

 

ابتدا میایم مقدار  رو کد میکنیم

$encrypted = $mcrypt->encrypt("Text to encrypt");

 

سپس همون مقدار رو نیز دیکد میکنیم

$decrypted = $mcrypt->decrypt($encrypted);

 

کد های تکمیلی php

$mcrypt = new MCrypt();
#Encrypt
$encrypted = $mcrypt->encrypt("Text to encrypt");
#Decrypt
$decrypted = $mcrypt->decrypt($encrypted);

 

 

امید وارم آموزش مفیدی برای شما باشه

من الله التوفیق

لینک ارسال
به اشتراک گذاری در سایت های دیگر
  • 1 ماه بعد...
در 7 ساعت قبل، MR _ RGF گفته است :

میشه مقدار دو متغییر  iv و SecretKey رو تغییر داد ؟؟؟

بله میشه ولی باید در هر دو طرف یکی باشند  یعنی سمت  php و  سمت  جاوا

لینک ارسال
به اشتراک گذاری در سایت های دیگر
  • 3 ماه بعد...

سلام من اطلاعات رو با استفاده از volley  و همینطور json میفرستم سمت پی اچ پی یا میگیرم

میخوام اطلاعات مثلا یوزر ها مثلا پسوردشون(یوزرنیم هم هست ولی خب اون نیاز به هش کردن نداره) بصورت هش توی دیتابیس سرور php م ذخیره بشه ، باید چیکار کنم؟

لینک ارسال
به اشتراک گذاری در سایت های دیگر

اگر میخواید با php این کار رو بکنید که میشه از ()md5 استفاده کرد که البته به هیچ عنوان امن نیست مگر اینکه خودتون چندتا کاراکتر قبل و بعدش اضافه کنید

لینک ارسال
به اشتراک گذاری در سایت های دیگر

برای hash  کردن پسورد از تابع زیر استفاده کنید

 

password_hash("123456", PASSWORD_DEFAULT);

برای برسی صحیح بودن پسورد  هم از تابع زیر

 

$hash = '$1$toHVx1uW$KIvW9yGZZSU/1YOidHeqJ/';

if (password_verify('123456', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در 5 ساعت قبل، Seven7up گفته است :

برای hash  کردن پسورد از تابع زیر استفاده کنید

 


password_hash("123456", PASSWORD_DEFAULT);

برای برسی صحیح بودن پسورد  هم از تابع زیر

 


$hash = '$1$toHVx1uW$KIvW9yGZZSU/1YOidHeqJ/';

if (password_verify('123456', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}

 

جسارتا کجا باید از این کد استفاده کنم؟

جایی که پاسورد رو اد میکنم توی دیتابیس یا جایی که تیبل دیتابیس و در نتیجه ستون پسورد رو میسازم؟

لینک ارسال
به اشتراک گذاری در سایت های دیگر

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

لینک ارسال
به اشتراک گذاری در سایت های دیگر

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...