1: <?php
2: /**
3: * @filesource Kotchasan/Password.php
4: *
5: * @copyright 2016 Goragod.com
6: * @license http://www.kotchasan.com/license/
7: *
8: * @see http://www.kotchasan.com/
9: */
10:
11: namespace Kotchasan;
12:
13: /**
14: * Password Class
15: *
16: * @author Goragod Wiriya <admin@goragod.com>
17: *
18: * @since 1.0
19: */
20: class Password
21: {
22: /**
23: * ฟังก์ชั่น ถอดรหัสข้อความ
24: * คืนค่าข้อความที่ถอดรหัสแล้ว
25: *
26: * @assert (Password::encode("ทดสอบภาษาไทย", 12345678), 12345678) [==] "ทดสอบภาษาไทย"
27: * @assert (Password::encode(1234, 12345678), 12345678) [==] 1234
28: *
29: * @param string $string ข้อความที่เข้ารหัสจาก encode()
30: * @param string $password คีย์สำหรับการเข้ารหัส
31: *
32: * @return string
33: */
34: public static function decode($string, $password)
35: {
36: list($data, $iv) = explode('::', base64_decode($string), 2);
37: return openssl_decrypt($data, 'aes-256-cbc', $password, 0, $iv);
38: }
39:
40: /**
41: * ฟังก์ชั่น เข้ารหัสข้อความ
42: * คืนค่าข้อความที่เข้ารหัสแล้ว
43: *
44: * @param string $string ข้อความที่ต้องการเข้ารหัส
45: * @param string $password คีย์สำหรับการเข้ารหัส
46: *
47: * @return string
48: */
49: public static function encode($string, $password)
50: {
51: $iv = self::uniqid(16);
52: $encrypted = openssl_encrypt($string, 'aes-256-cbc', $password, 0, $iv);
53: return base64_encode($encrypted.'::'.$iv);
54: }
55:
56: /**
57: * สร้าง Sign สำหรับส่งให้ API
58: *
59: * @param array $params
60: * @param string $secret
61: *
62: * @return string
63: */
64: public static function generateSign($params, $secret)
65: {
66: // เรียงลำดับตามคีย์
67: ksort($params);
68: // นำข้อมูลมาต่อกัน
69: $data = '';
70: foreach ($params as $k => $v) {
71: $data .= $k.$v;
72: }
73: // คืนค่าข้อความเข้ารหัส
74: return strtoupper(hash_hmac('sha256', $data, $secret));
75: }
76:
77: /**
78: * สร้าง password แบบสุ่ม
79: *
80: * @param int $length ความยาวของ password ที่ต้องการ
81: *
82: * @return string
83: */
84: public static function uniqid($length = 13)
85: {
86: if (function_exists('random_bytes')) {
87: $token = random_bytes(ceil($length / 2));
88: } else {
89: $token = openssl_random_pseudo_bytes(ceil($length / 2));
90: }
91: return substr(bin2hex($token), 0, $length);
92:
93: }
94: }
95: