淺談TOTP(Time-based One-time Password)

totp

TOTP 是利用 Application and services 上時間是一致,拿二邊共同的 key ,並且作一樣的 Hash 後,結果會產生一樣的 token,即可拿來作驗證,常被使用來作二次驗證(two-step verification)。

因為這部份的演算法是 RFC6238,所以可使用任何的 apps 來協助驗證,例如:Google Authenticator, Duo 之類的。

怎麼實作的

PHP 有人作好了: otphp

跟據 wikipedia 裡的 Implementation 章節中,有一段描述如何產生 token:

  1. Calculate C as the number of times TI has elapsed after T0.
  2. Compute the HMAC hash H with C as the message and K as the key (the HMAC algorithm is defined in the previous section, but also most cryptographical libraries support it). K should be passed as it is, C should be passed as a raw 64-bit unsigned integer.
  3. Take the least 4 significant bits of H and use it as an offset, O.
  4. Take 4 bytes from H starting at O bytes MSB, discard the most significant bit and store the rest as an (unsigned) 32-bit integer, I.
  5. The token is the lowest N digits of I in base 10. If the result has fewer digits than N, pad it with zeroes from the left.

如果覺得太復雜,我挖了一下 otphp,應該在 otphp/src/OTP.php 裡面的 protected function generateOTP($input) 中有實作。

使用

安裝 composer require spomky-labs/otphp

sample code:

<?php
require __DIR__ . '/vendor/autoload.php';
use OTPHP\TOTP;

$totp = new TOTP(
    "whatup.tw@gmail.com" // The label (string)
);
$google_chart = $totp->getQrCodeUri();
$otpCode = $totp->now();
echo "<img src='{$google_chart}'><br/>";
echo "Current OTP: " . $totp->now() . "<br/>\n";
echo "Current Secret: " . $totp->getSecret() . "<br/>\n";
echo "Verify OTP: " . $totp->verify($otpCode) . "<br/>\n";
?>

到 browser 執行後會產生下面畫面:
totp example result

接下來你就拿出你的 Google Authenticator 來掃這個條碼,就可以新增一組新驗證碼。

Google Authenticator 預設是 30s ,所以 30s 後,這個 OTP 產生出來的 token 應該會無法使用。如果你的 application 可以看到 secret 的話,應該會看到 app & service 的 secret 應該要一樣。

剩下的可以參考 document 說的很清楚。

限制

  • 其實無法防止 phishing 網頁用假的頁面來騙你資料,在你輸入 token 後,壞人在 30s 之內也可以同時登入。
  • secret key 如果被人拿走,別人也同時擁有通過二次驗證的能力。
  • app & services 之間的時間一定不能差太多,所以手機不能調整時間(有人喜歡看時鐘快五分鐘)。

2016 美濃彩繪大地-美濃花海

每年過年期間,美濃在中正湖附近會出現大片的波斯菊花海。
我覺得跟荷蘭的鬱金香花海和北海道的薰衣草花海有幾分相似,一大片的花海遍佈中正湖。
再加上冬天是高雄的乾季,不太下雨且天氣也沒有北部這麼冷,是個適合全家出遊的好天氣。

在中正湖邊有一個大大的 LOVE ,搭配著客家花布的色彩和整片的波斯菊花海,有不少人在這跟 LOVE 一起合照。
不過現在花還開的不夠盛大,尚有一小部份還是還是綠色底色。
Love!

從這裡往湖的方向望去,可以看到大片的花海搭配著中正湖中的涼亭,而遠方背景中的山是人字山。
美濃中正湖旁

搭配著冬天的金色的夕陽和整片的花海,感覺和冰冷的北部完全不一樣,整個人都暖了起來。
夕陽下的美濃花海

各種顏色的波斯菊看起來非常的壯觀。
夕陽下的美濃花海

紅色的波斯菊配上紫色的稻草人別有一番風味。
夕陽下的美濃花海

好幾個月沒放風了,難得放風的潔終於可以小小的出門走走了。
難得放風的潔

過年期間如果不知道要往哪跑可以來美濃賞花海啊,適合全家大小一起來拍照!

Let’s Encrypt 免費讓你的網站升級成 SSL ready

Our Commitment to Protecting Your Information by Marissa Mayer, Yahoo CEO

2013 年底時,美國方面爆出政府直接拉線路進 Yahoo 機房偷取使用者資料,所以在2014 年初時 Yahoo 宣布全面使用 SSL 連線來保護連線資料。但買一個 SSL 憑證實在是太貴了,如果一堆 domain 的話,更是負擔不起。所以在自已用的小站通常都用 self-sigh 來解決這個問題,只是使用時會一直被 Browser 靠腰說你的 SSL 是不合法的。

時至今日, Internet Security Research Group (ISRG) 組織為了網路安全,提供了免費的 SSL 申請服務 - Letsencrypt ,主要有下列幾項特色:

  • Free: Anyone who owns a domain name can use Let’s Encrypt to obtain a trusted certificate at zero cost.
  • Automatic: Software running on a web server can interact with Let’s Encrypt to painlessly obtain a certificate, securely configure it for use, and automatically take care of renewal.
  • Secure: Let’s Encrypt will serve as a platform for advancing TLS security best practices, both on the CA side and by helping site operators properly secure their servers.
  • Transparent: All certificates issued or revoked will be publicly recorded and available for anyone to inspect.
  • Open: The automatic issuance and renewal protocol will be published as an open standard that others can adopt.
  • Cooperative: Much like the underlying Internet protocols themselves, Let’s Encrypt is a joint effort to benefit the community, beyond the control of any one organization.

這項服務在 2015/12/3 已經 Open Beta 了,任何人可以直接使用,不需申請。

Install

使用方法也很簡單到 github 下載 letsencrypt client 後,直接執行 ./letsencrypt-auto --help all 就可以看到所有的說明和使用方法。

Renew

預設的 SSL 90 天後就會過期,所以我就排個 cron 每天去跑一次。
這個 Script 會刮出所有 apache2 底下有開 443 port 的 servername 去 renew SSL。其中 --renew-by-default--agree-tos 開啟後 CLI 介面不會問東問西的選項。

#!/bin/sh
/usr/sbin/apachectl stop

/home/whatup/letsencrypt/letsencrypt-auto certonly -a  standalone --renew-by-default --agree-tos `grep -ih servername /etc/apache2/sites-enabled/*|grep 44
3 | sed 's/:443//g' | sed 's/ServerName/-d/g' `  --email whatup.tw@gmail.com

/usr/sbin/apachectl start

Rate Limit

流量限制如下,自已要多加注意,要不然會被檔掉。

  • Registrations per IP is 10 registrations per 3 hour window.
  • Certificates per name is 10 certificates per 59 days.
  • Pending registrations per account is 300 per 1 week.

Result

看到綠色合法的 SSL Icon 就是開心!
Screen Shot 2015-12-03 at 9.47.04 AM

Screen Shot 2015-12-07 at 10.24.43 AM
Screen Shot 2015-12-07 at 10.25.09 AM
Screen Shot 2015-12-07 at 10.25.30 AM
Screen Shot 2015-12-07 at 10.24.56 AM

[澳洲] 會有人生跑馬燈的 Skydive

2012 年底的時候,我從像玉山一樣高度的地方往下跳,眼前除了美景之外,就是人生跑馬燈。為了完成了我其中一項夢想,每秒差不多燒了台幣100元。

跳傘高度可以分成 9000/11000/14000 英呎三種高度,當然價格也不一樣。

老爹說既然要嘗試跳傘,而且這輩子還不知道有沒有辦法再跳一次,當然要直接挑戰最高的地方往下跳。

本來我也不想買 DVD 的,但是老爹說,你不買要怎麼證明你這輩子有跳過傘。我就腦波很弱的也跟著買下去,但事後證明,如果不買 DVD 真的會後悔,要不然現在怎麼跟朋友炫耀。

而到現在,在天空中的每一秒鐘都深印在腦海裡。

跳傘影片

在空中漂浮的當下

跳傘當下

在夕陽的時候往下跳,夕陽、城市、海灘都好美

在夕陽的時候跳下,夕陽、城市、海灘都好美

由空中往下望,腳下的城市

城市