手机APP和服务器端通信DES加密

由于Android应用没有像web开发中的session机制,所以采用PHPSESSID的方式,是没有办法获取客户端登录状态的。

这种情况下,如何在用户登录后,服务器端获取用户登录状态并保持,就必须采用一种“握手”的方式。

每个手机都有自己的IMEI号,那么能不能通过这个标识去做认证呢?

经过试验,答案是可以!

客户端在请求服务器端的时候,请求参数为 IMEI (param 1)及  IMEI&UA (param 2)经过加密的字符串;服务器端对客户端传递的两个参数进行解密,比对两个IMEI值是否相同。如果相同,返回token给客户端,以后每次客户端请求服务器端的时候,都携带该token。这样服务器就可以获取用户登录状态了。

这里,我采用的DES加密的方式,由于PHP和Java的DES加密是有差异的,所以单独进行处理:

java :

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import java.security.Key; import java.security.SecureRandom; import java.security.spec.AlgorithmParameterSpec;
  import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.IvParameterSpec;
  
  import com.sun.org.apache.xml.internal.security.utils.Base64;
  public class Des2
{
     public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding" ;
  
     /**
      * DES算法,加密
      *
      * @param data 待加密字符串
      * @param key  加密私钥,长度不能够小于8位
      * @return 加密后的字节数组,一般结合Base64编码使用
      * @throws CryptException 异常
      */
     public static String encode(String key,String data) throws Exception
     {
         return encode(key, data.getBytes());
     }
     /**
      * DES算法,加密
      *
      * @param data 待加密字符串
      * @param key  加密私钥,长度不能够小于8位
      * @return 加密后的字节数组,一般结合Base64编码使用
      * @throws CryptException 异常
      */
     public static String encode(String key, byte [] data) throws Exception
     {
         try
         {
             DESKeySpec dks = new DESKeySpec(key.getBytes());
              
             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "DES" );
             //key的长度不能够小于8位字节             Key secretKey = keyFactory.generateSecret(dks);
             Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
             IvParameterSpec iv = new IvParameterSpec( "12345678" .getBytes());
             AlgorithmParameterSpec paramSpec = iv;
             cipher.init(Cipher.ENCRYPT_MODE, secretKey,paramSpec);
              
             byte [] bytes = cipher.doFinal(data);
              
             return Base64.encode(bytes);
         } catch (Exception e)
         {
             throw new Exception(e);
         }
     }
  
     /**
      * DES算法,解密
      *
      * @param data 待解密字符串
      * @param key  解密私钥,长度不能够小于8位
      * @return 解密后的字节数组
      * @throws Exception 异常
      */
     public static byte [] decode(String key, byte [] data) throws Exception
     {
         try
         {
             SecureRandom sr = new SecureRandom();
             DESKeySpec dks = new DESKeySpec(key.getBytes());
             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "DES" );
             //key的长度不能够小于8位字节             Key secretKey = keyFactory.generateSecret(dks);
             Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
             IvParameterSpec iv = new IvParameterSpec( "12345678" .getBytes());
             AlgorithmParameterSpec paramSpec = iv;
             cipher.init(Cipher.DECRYPT_MODE, secretKey,paramSpec);
             return cipher.doFinal(data);
         } catch (Exception e)
         {
             throw new Exception(e);
         }
     }
      
     /**
      * 获取编码后的值
      * @param key
      * @param data
      * @return
      * @throws Exception
      */
     public static String decodeValue(String key,String data) 
     {
         byte [] datas;
         String value = null ;
         try {
             if (System.getProperty( "os.name" ) != null && (System.getProperty( "os.name" ).equalsIgnoreCase( "sunos" ) || System.getProperty( "os.name" ).equalsIgnoreCase( "linux" )))
             {
                 datas = decode(key, Base64.decode(data));
             }
             else
             {
                 datas = decode(key, Base64.decode(data));
             }
              
             value = new String(datas);
         } catch (Exception e) {
             value = "" ;
         }
         return value;
     }
  
     /**
     * test 
     * @param key : 12345678
     */
     public static void main(String[] args) throws Exception
     {
          
         System.out.println( "明:cychai ;密:" + Des2.encode( "12345678" , "cychai" ));
     }
}

PHP:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
class DES
{
     var $key ;
     var $iv ; //偏移量
     function DES( $key , $iv =0)
     {
         $this ->key = $key ;
         if ( $iv == 0)
         {
             $this ->iv = $key ;
         }
         else 
         {
             $this ->iv = $iv ;
         }
     }
  
     //加密     function encrypt( $str )
     {       
         $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC );
         $str = $this ->pkcs5Pad ( $str , $size );
          
         $data =mcrypt_cbc(MCRYPT_DES, $this ->key, $str , MCRYPT_ENCRYPT, $this ->iv);
         //$data=strtoupper(bin2hex($data)); //返回大写十六进制字符串         return base64_encode ( $data );
     }
      
     //解密     function decrypt( $str )
     {
         $str = base64_decode ( $str );
         //$strBin = $this->hex2bin( strtolower($str));         $str = mcrypt_cbc(MCRYPT_DES, $this ->key, $str , MCRYPT_DECRYPT, $this ->iv );
         $str = $this ->pkcs5Unpad( $str );
         return $str ;
     }
  
     function hex2bin( $hexData )
     {
         $binData = "" ;
         for ( $i = 0; $i < strlen ( $hexData ); $i += 2)
         {
             $binData .= chr (hexdec( substr ( $hexData , $i , 2)));
         }
         return $binData ;
     }
  
     function pkcs5Pad( $text , $blocksize )
     {
         $pad = $blocksize - ( strlen ( $text ) % $blocksize );
         return $text . str_repeat ( chr ( $pad ), $pad );
     }
  
     function pkcs5Unpad( $text )
     {
         $pad = ord ( $text { strlen ( $text ) - 1} );
         if ( $pad > strlen ( $text ))
             return false;
         if ( strspn ( $text , chr ( $pad ), strlen ( $text ) - $pad ) != $pad )
             return false;
         return substr ( $text , 0, - 1 * $pad );
     }
} $str = 'abc' ; $key = '12345678' ; $crypt = new DES( $key ); $mstr = $crypt ->encrypt( $str ); $str = $crypt ->decrypt( $mstr );
  echo  $str . ' <=> ' . $mstr ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值