數據加密傳輸

背景

最近做的一個項目,用到了數據加密傳輸,我們用AES加密的時候要用到base64編碼,但是android的base64和java的base64不一致,一開始我和java服務端用同一個jar包下的base64,在android下會報FileNotFoundException,經過研究之后,這個問題解決了,但是又有個新異常,忘了是什么了,最后的解決辦法是我用android下的base64,他還是用原來的,順利解決了。

當然還有一些問題,那么產生這些問題的根源在哪兒呢,其實在跟其他服務器交互的時候難免也產生了一些問題,尤其是調試的時候,如果在Linux下還好,Windows調試的時候這種問題就會經常出現,包括對圖片的處理等等。

Android本身是Linux內核,和Windows有很多細節上的區別,比如最常用的轉義符,一個是\,一個是/,還有對圖片處理的時候,寬和高有時候會有些出入。


正題

正經點,碼農說代碼:
一般情況下,登錄密碼只需要MD5加密就可以了,但是對一些敏感數據,通常情況下是先用AES加密,再用MD5對密鑰進行加密,以保證安全性

AES

AES是一種可逆加密算法,對用戶的敏感信息加密處理 對原始數據進行AES加密后,在進行Base64編碼轉化,經測試,直接用android的Base64完全可以在java環境下直接解密。

package com.cyyz.util;

import java.util.Arrays;

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

import android.util.Base64;

/**
 * AES 是一種可逆加密算法,對用戶的敏感信息加密處理 對原始數據進行AES加密后,在進行Base64編碼轉化;
 * @author jty 
 */
public class AESOperator {

    // 加密
    public static String encrypt(String src, String key) {
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
        IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(key.getBytes(), 0, 16));//

        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
            byte[] encrypted = cipher.doFinal(src.getBytes("utf-8"));
            return Base64.encodeToString(encrypted, Base64.DEFAULT);// 此處使用BASE64做轉碼。
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    // 解密
    public static String decrypt(String src, String key) {
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
        IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(key.getBytes(), 0, 16));//
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
            byte[] encrypted1 = Base64.decode(src, Base64.DEFAULT);// 先用base64解密
            byte[] original = cipher.doFinal(encrypted1);
            String originalString = new String(original, "utf-8");
            return originalString;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

}

MD5

MD5即信息摘要算法5,用于確保信息傳輸完整一致,是一種不可逆雜湊算法,也是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法)。

import java.security.MessageDigest;

/** 
 * MD5Utils
 * @author jty 
 */

public class MD5Utils {

    public final static String md5(String s) {
        char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'A', 'B', 'C', 'D', 'E', 'F' };
        try {
            byte[] btInput = s.getBytes();
            MessageDigest mdInst = MessageDigest.getInstance("MD5");
            mdInst.update(btInput);
            byte[] md = mdInst.digest();
            int j = md.length;
            char str[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            return null;
        }
    }
}


其他算法

常用的其他算法通常還有DES,RSA等,一般如果不是申請國密資質或者商用密碼的公司,會用就行了,比如我這種數學渣渣。

多謝觀賞!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容