Google Code Prettify

2018年8月14日 星期二

Spring Security: 密碼加密

這年頭網站的密碼不太可能會以明碼儲存,或是以對稱加密的方式加密後儲存,這就不多說了 … spring security 5.x 提供不少非對稱加密的演算法 bcrypt、MD5、SHA-1、SHA-256 … 預設是 bcrypt。看一下底下程式,應該就可以初步了解怎麼加密、比對。
PasswordEncoder encoder1 = PasswordEncoderFactories.createDelegatingPasswordEncoder();

String encryption1 = encoder1.encode("abcdefg");
System.out.println("bcrypt1:" + encryption1);
  
String encryption2 = encoder1.encode("abcdefg");
System.out.println("bcrypt2:" + encryption2);
  
PasswordEncoder encoder2 = new BCryptPasswordEncoder();
boolean result = encoder2.matches("abcdefg", "$2a$10$aKFYCaH2bRMeIB.FBAWC6.NcsEF.yR.3FXm/ZhIULLDudtXnMQ/Ni");
System.out.println("比較結果: " + result);
輸出結果可能如下:
bcrypt1:{bcrypt}$2a$10$ZiYiw5U397Zr3ORAc/NrbutwH2p5YqzlE/Ugk34oCW6/s2LloIjWy
bcrypt2:{bcrypt}$2a$10$2UcGko8JuZ4Xze/jqv17yeAxhALhIyU/Usx4uKXHTe6D.e/vUHrq6
比較結果: true
加密後產生的字串會是 {加密演算法}加密後字串,這樣的格式,演算法這麼明明白白的公告出來不會讓黑客有機可趁? 這倒可以放心,因為這些演算法一方面都是公開的,另一方面是,黑客從產生出來的字串也多半可以猜出是用什麼演算法加密的,所以,這些演算法要經的起考驗,本來就要設計成即使知道加密的演算法,也無法得知密碼。

再來看一下程式,PasswordEncoderFactories 是 spring security 提供的工廠類別,可以產生一個 DelegatingPasswordEncoder 類別的物件,預設是用 bcrypt 演算法,如果我們想用其它演算法呢? 官網的 Docs 提供了如下的方法:
String idForEncode = "bcrypt";
Map encoders = new HashMap<>();
encoders.put(idForEncode, new BCryptPasswordEncoder());
encoders.put("noop", NoOpPasswordEncoder.getInstance());
encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
encoders.put("scrypt", new SCryptPasswordEncoder());
encoders.put("sha256", new StandardPasswordEncoder());

PasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(idForEncode, encoders);
這個官方的範例,簡單的就是 new 一個 DelegatingPasswordEncoder,並把要使用的加密演算法及其代碼傳入。

回過頭來看上面輸出的結果,同樣加密 "abcdefg",bcrypt1、bcrypt2 輸出的字串並不一樣,事實上每次加密都不會一樣,所以,比對密碼是否相同不能直接用 equals 比對,而要用PasswordEncoder 提供的 matches() method,第一個參數傳入明碼的密碼,第二個參數則傳入要比對的加密後的密碼字串,這樣就可以傳回 true (相同) 或 false (不同)。

2018年8月11日 星期六

install Kafka (single node)

安裝 Apache Kafka 前要先安裝 jdkzookeeper,所以先下載 jdk、zookeeper 及 kafka,我下載的三個檔案為 jdk-8u181-linux-x64.tar.gz、zookeeper-3.4.12.tar.gz 及 kafka_2.12-2.0.0.tgz,放在 /home/steven 底下 (我自己的 home 目錄),用以下指令解開:
tar zxvf jdk-8u181-linux-x64.tar.gz
tar zxvf zookeeper-3.4.12.tar.gz
tar zxvf kafka_2.12-2.0.0.tgz
然後搬到 /usr/local/bin 目錄下,這是我的個人習慣,自己安裝的軟體就放這個目錄。暫且我們稱這三個目錄為 $JAVA_HOME、$ZOOKEEPER 及 $KAFKA。要怎麼設定 JAVA_HOME,可以參考這一篇 -- 「安裝 JDK」。
  • 安裝 zookeeper
進入 $ZOOKEEPER/conf 目錄,可以看到 zoo_sample.cfg 設定檔的 sample,複製一份到 zoo.cfg,這是 zookeeper 預設的設定檔檔名。
cp zoo_sample.cfg zoo.cfg
然後回到 $ZOOKEEPER 目錄,執行以下 bin/zkServer.sh start 指令,看到如下訊息,就表示 zookeeper 啟動了。
ZooKeeper JMX enabled by default
Using config: /usr/local/bin/zookeeper-3.4.12/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
要查看 server 的狀態,可以用 telnet localhost 2181 (2181 為預設的 port),進入 server 後下 srvr 指令,就可以顯示出 server 的狀態了。
[root@localhost ~]# telnet localhost 2181
Trying ::1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.4.12-e5259e437540f349646870ea94dc2658c4e44b3b, built on 03/27/2018 03:55 GMT
Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x0
Mode: standalone
Node count: 4
Connection closed by foreign host.
  • 安裝 Kafka
進入 $KAFKA 目錄,下以下的指令:
bin/kafka-server-start.sh config/server.properties
如果要啟動背景模式,指令如下:
bin/kafka-server-start.sh -daemon config/server.properties