還記得以前產品同窗給我發了段代碼,要我看看,並且最近他一直在催我找工做,相必這也是和jd相關了。遂思考前端的加密方式:前端
總的來講,給前端能看懂的就Base64了。So,百度搜了下Base64,果真第一個就是能用的工具,嘿嘿嘿~成功裝了波13git
So,結束了嗎,怎麼可能?首先來吐幾個槽點:github
咳咳咳~下面開始裝13瀏覽器
關於它的詳細信息,口水說沒了我均可能講不清楚,這波自行維基。工具
簡單來講,有規律地把三個字符變四個,不夠的填上=
號。固然,這四個字符也有規定:A-Z、a-z、0-九、+、/
,總共64個,沒毛病網站
好的,如今重點是變戲法(3 => 4):ui
index
爲63,轉換成二進制爲111111
,最小爲6位三、四、6
最小公倍數爲24說的看似無關,其實步步緊要。來看一張轉換圖編碼
被安排的明明白白~[笑哭]。仍是有點兒暈,看栗子 ok,差很少也知道它的轉化原理了。可是,"talk is cheap, show me the code"。固然了,這還不簡單,寫個循環就夠了:加密
+
號拼接...pia,pia,pia~打臉,再這樣人人都成產(gong)品(cheng)經理(shi)了。看起來沒毛病,我就是這麼想的了,但是看完github上star最多的js-base64
項目後,發現臉很腫。。。spa
喜聞樂見的代碼段,這裏只是js-base64
的簡化版,有興趣的老鐵能夠去github上看。首先準備點知識:
// 按位操做符 & | >>> <<,可參考MDN上文檔
// &,只有兩個位都爲1才得1
0010 & 1111; // 0010
// |,至少有個1能得1
0010 | 1111; // 1111
// <<,左移,右側填0
0010 << 2; // 1000
// >>>,無符號右移,右側丟棄,左側填0
0010 >>> 2; // 0000
複製代碼
從核心開始,三轉四的粗略版:
// Base64字符串
const base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
// 原字符串
const word3 = 'Tao';
const len = word3.length
// 1. 第一個字符ASCII的二進制右移16位,變成了24位二進制
// 2. 第二個右移8位
// 3, 三個二進制按位或,把後兩個二進制填到第一個。這正是精彩之處!
// 其實我第一次看時,當作了邏輯或,一直納悶兒它怎麼處理三個字符的,hah
const bit24 = word3.charCodeAt(0) << 16
| (len > 1 ? word3.charCodeAt(1) << 8 : 0)
| (len > 2 ? word3.charCodeAt(2) : 0);
const word4Array = [
base64.charAt(bit24 >>> 18),
// & 63,保證取得後6位二進制,由於前面都爲0,按位與掉了
base64.charAt((bit24 >>> 12) & 63),
len === 1 ? '=' : base64.charAt((bit24 >>> 6) & 63),
len <= 2 ? '=' : base64.charAt(bit24 & 63),
];
console.log(word4Array.join('')); // 加密字符串:VGRU
複製代碼
反過來解碼亦然,不過有幾個注意點:
& 255
,由於255.toString(2) === '11111111'
,8位上面只是字符轉Base64,還有圖片轉呢?這個我不知道,等各路大神解答[笑哭]...
固然,瀏覽器裏提供的方法傻瓜式調用仍是能夠的。使用FileReader API,例如:
const file = document.querySelector('[type="file"]').files[0];
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => console.log(reader.result);
複製代碼
轉圖片更簡單,直接img.src = 'data:image/*;base64,'+ str
便可。
轉字符也沒問題,現代瀏覽器的兩方法:
window.atob
,解碼window.btoa
,編碼Suprise the mother fuck,說了半天原來瀏覽器都有。全都是安排~
附上一張兼容性圖:
徹底能用了,老鐵。Base64維基:en.wikipedia.org/wiki/Base64
js-base64項目:github.com/dankogai/js…
ps:項目做者好像是臺灣同胞,看到readme裏繁體字了。不過道聽途說國家要收復臺灣了 ,就在幾年以內,搞很差過個2-3年要打仗了....