/** * Generates a hashing key for further repeatable hashes. * * @param int $length Length of the key being generated for hashing. * @return string * @throws Exceptions\InvalidTypeException * @throws Exceptions\OutOfRangeException */ public static function generateKey($length = Constants::GENERICHASH_KEYBYTES) { # Test the length for validity. Helpers::rangeCheck($length, Constants::GENERICHASH_KEYBYTES_MAX, Constants::GENERICHASH_KEYBYTES_MIN, 'Hash', 'generateKey'); # Return the hash to the client. return self::hash(Entropy::bytes($length), '', $length); }
/** * Returns an encrypted message in the form of a JSON string. * * @param string $message The message to be encrypted. * @param string $key The key to encrypt the message with. * @param string $hashKey The key to hash the key with. * @return string The JSON string for the encrypted message. * @throws Exceptions\EncryptionException * @throws Exceptions\InvalidTypeException * @throws Exceptions\OutOfRangeException */ public static function encryptMessage($message, $key, $hashKey = '') { // Test the key for string validity. Helpers::isString($message, 'Encryption', 'encryptMessage'); Helpers::isString($key, 'Encryption', 'encryptMessage'); Helpers::isString($hashKey, 'Encryption', 'encryptMessage'); // Create a special hashed key for encryption. $key = Hash::hash($key, $hashKey, Constants::SECRETBOX_KEYBYTES); // Generate a nonce for the communication. $nonce = Entropy::generateNonce(); // Serialize and encrypt the message object $ciphertext = \Sodium\crypto_secretbox(serialize($message), $nonce, $key); $nonce = base64_encode($nonce); $ciphertext = base64_encode($ciphertext); $json = json_encode(compact('nonce', 'ciphertext')); if (!is_string($json)) { throw new Exceptions\EncryptionException('Failed to encrypt message using key'); } return base64_encode($json); }
public function respondenSubmitAction() { //Disable view $this->view->disable(); //Get and process posted data if ($this->request->isPost() && !empty($kue_id = (int) $this->request->getPost("detail_kue_id", "int")) && is_array($kue_krit_id = $this->request->getPost("kue_krit_id")) && is_array($krit_weight = $this->request->getPost("krit_weight"))) { $id_responden = $this->session->get("auth")["user"]->getIdUser(); if (count($kue_krit_id) < 1 || count($krit_weight) < 1 || count($kue_krit_id) != count($krit_weight)) { $this->flashSession->error("Invalid input parameters!"); return $this->response->redirect("kuesioner"); } $kuesioner_head = KuesionerHead::findFirst(array("id_kuesioner = :kue_id: AND active = true", "bind" => array("kue_id" => $kue_id))); if (empty($kuesioner_head)) { $this->flashSession->error("Damn! Invalid kuesioner id! Where do you got this fake id from?"); return $this->response->redirect("kuesioner"); } $kue_access = KuesionerAccess::findFirst(array("id_kuesioner = :kue_id: AND id_responden = :id_responden:", "bind" => array("kue_id" => $kue_id, "id_responden" => $id_responden))); if (empty($kue_access) || $kue_access->getStatus() != 'N') { $this->flashSession->error("Damn! You either don't have permission to access or " . "you've already submit this kuesioner before"); return $this->response->redirect("kuesioner"); } for ($i = 0; $i < count($kue_krit_id); $i++) { $kue_value = new KuesionerValue(); $kue_value->setIdKueKrit($kue_krit_id[$i])->setIdResponden($id_responden)->setWeight($krit_weight[$i]); if (!$kue_value->save()) { $this->flashSession->error("Fatal Error! Could not record kuesioner value!"); foreach ($kue_value->getMessages() as $err) { $this->flashSession->error($err); } return $this->response->redirect("kuesioner"); } } //Prepare to update kuesioner_normalisasi table $kue_value = KuesionerValue::query()->columns(array("id_kue_krit", "id_responden", "weight - " . KuesionerValue::maximum(array("id_kue_krit IN (" . implode(",", $kue_krit_id) . ")", "column" => "weight")) . " AS normalisasi_value"))->inWhere("id_kue_krit", $kue_krit_id)->execute(); foreach ($kue_value as $k) { //Reuse kuesioner_normalisasi record if already exist $kue_normalisasi = KuesionerNormalisasi::findFirst(array("id_kue_krit = :id_kue_krit: AND id_responden = :id_responden:", "bind" => array("id_kue_krit" => $k->id_kue_krit, "id_responden" => $k->id_responden))); if (empty($kue_normalisasi)) { $kue_normalisasi = new KuesionerNormalisasi(); } $kue_normalisasi->setIdKueKrit($k->id_kue_krit)->setIdResponden($k->id_responden); //Normalisasi value = kriteria weight - max kuesioner value $kue_normalisasi->setValue($k->normalisasi_value); if (!$kue_normalisasi->save()) { $this->flashSession->error("Unable to update normalisasi table! This is dangerous!"); foreach ($kue_normalisasi->getMessages() as $err) { $this->flashSession->error($err); } return $this->response->redirect("kuesioner"); } } //Prepare to update hasil_matriks_a table $kue_normalisasi = KuesionerNormalisasi::query()->columns(array("id_kue_krit", "id_responden", "value / " . KuesionerNormalisasi::sum(array("id_kue_krit IN (" . implode(",", $kue_krit_id) . ")", "column" => "value")) . " AS matriks_a_value"))->inWhere("id_kue_krit", $kue_krit_id)->execute(); foreach ($kue_normalisasi as $k) { //Reuse hasil_matriks_a record if already exist $matriks_a = HasilMatriksA::findFirst(array("id_kue_krit = :id_kue_krit: AND id_responden = :id_responden:", "bind" => array("id_kue_krit" => $k->id_kue_krit, "id_responden" => $k->id_responden))); if (empty($matriks_a)) { $matriks_a = new HasilMatriksA(); } $matriks_a->setIdKueKrit($k->id_kue_krit)->setIdResponden($k->id_responden); //Matriks a value = normalisasi value / total normalisasi value $matriks_a->setValue($k->matriks_a_value); if (!$matriks_a->save()) { $this->flashSession->error("Unable to update matriks a table! This is terrible!"); foreach ($matriks_a->getMessages() as $err) { $this->flashSession->error($err); } return $this->response->redirect("kuesioner"); } } //Prepare to update entropy table $entropy_values = array(); $dispersi_values = array(); $dispersi_sum = 0; $resp_total = KuesionerValue::count(array("id_kue_krit IN (" . implode(",", $kue_krit_id) . ")", "column" => "DISTINCT id_responden")); $ln_responden_total = log($resp_total); for ($i = 0; $i < count($kue_krit_id); $i++) { $entropy_values[$i] = -1 / $ln_responden_total * HasilMatriksA::sum(array("id_kue_krit = :kue_krit_id:", "column" => "value + LN(value)", "bind" => array("kue_krit_id" => $kue_krit_id[$i]))); $dispersi_values[$i] = 1 - $entropy_values[$i]; $dispersi_sum += $dispersi_values[$i]; } for ($i = 0; $i < count($kue_krit_id); $i++) { //Check for old entropy records presence, reuse if there's one $entropy = Entropy::findFirstByIdKueKrit($kue_krit_id[$i]); if (empty($entropy)) { $entropy = new Entropy(); } $entropy->setIdKueKrit($kue_krit_id[$i])->setEntropyValue($entropy_values[$i])->setDispersiValue($dispersi_values[$i])->setWeightValue($dispersi_values[$i] / $dispersi_sum); if (!$entropy->save()) { $this->flashSession->error("Unable to update entropy table! Please undo process manually!"); foreach ($entropy->getMessages() as $err) { $this->flashSession->error($err); } return $this->response->redirect("kuesioner"); } } if (!$kuesioner_head->setStatus('L')->save() || !$kue_access->setStatus('S')->save()) { $this->flashSession->error("Fatal Error! Failed to lock/change kuesioner's status for this request."); } else { $this->flashSession->success("Data telah sukses disimpan ke database."); } return $this->response->redirect("kuesioner"); } }