如今主流的仍是base64編碼,進行對字符串的編碼。base64其實不是安全領域下的加密解密算法。雖然有時候常常看到所謂的base64加密解密。其實base64只能算是一個編碼算法,對數據內容進行編碼來適合傳輸。雖然base64編碼事後原文也變成不能看到的字符格式,可是這種方式很初級,很簡單。通常高級一點的程序員一眼就能看出來是否是用的base64進行編碼,進而經過base64的解密,得出想要的結果。java
因此使用hash值進行編碼的轉換,由於hash值是惟一的,不可逆的!可是經過hash編碼倒是能夠的!二是由於hash值一串數字比較不容易辨別是否是hash值。
程序員
2.hash值算法
通常是把字符串或者byte[],當成一個數組進行遍歷,而後轉換爲int類型的值。hash主要用於信息安全領域中加密算法,它把一些不一樣長度的信息轉化成雜亂的128位的編碼,這些編碼值叫作HASH值. 也能夠說,hash就是找到一種數據內容和數據存放地址之間的映射關係。數組
3.hash值的計算算法安全
這個只是其中的一種算法:服務器
/** * 使用FNV1_32_HASH算法計算服務器的Hash值,這裏不使用重寫hashCode的方法,最終效果沒區別 */ private static int getHash(String str) { final int p = 16777619; int hash = (int)2166136261L; for (int i = 0; i < str.length(); i++) hash = (hash ^ str.charAt(i)) * p; hash += hash << 13; hash ^= hash >> 7; hash += hash << 3; hash ^= hash >> 17; hash += hash << 5; // 若是算出來的值爲負數則取其絕對值 if (hash < 0) hash = Math.abs(hash); return hash; }
4.字符串與byte[]數組之間的轉換app
//byte[]轉換String private static String bytesToHexString(byte[] src) { StringBuilder stringBuilder = new StringBuilder(""); if (src == null || src.length <= 0) { return null; } for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); } return stringBuilder.toString(); } //String轉換爲byte[] private static byte[] hexStringToBytes(String hexString) { if (hexString == null || hexString.equals("")) { return null; } hexString = hexString.toUpperCase(); int length = hexString.length() / 2; char[] hexChars = hexString.toCharArray(); byte[] d = new byte[length]; for (int i = 0; i < length; i++) { int pos = i * 2; d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); } return d; }