9 ارسال در این موضوع قرار دارد

با سلام

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

 

اول این کلاس   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);

 

 

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

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

3 کاربر پسندیده اند

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


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

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

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


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

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

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

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


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

ببخشید این کد حروف فارسی رو کد و دیکد نمیکنه ؟؟؟؟؟؟؟؟؟؟؟؟؟

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


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

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

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

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


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

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

1 کاربر پسند دیده است

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


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

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

 

password_hash("123456", PASSWORD_DEFAULT);

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

 

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

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

 

1 کاربر پسند دیده است

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


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
در 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.';
}

 

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

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

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


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

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

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


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

برای ارسال نظر یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید نظر ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در انجمن ما ثبت نام کنید. عضویت خیلی ساده است !


ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید


ورود به حساب کاربری