PageRenderTime 46ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/cryptography/crypt.php

https://github.com/uCore/uCore
PHP | 125 lines | 107 code | 17 blank | 1 comment | 16 complexity | d1cbdbc28b0e7f976d117c9bcb8a4c4c MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, Apache-2.0, GPL-2.0, LGPL-2.1
  1. <?php
  2. interface iCrypt {
  3. public static function CanUse();
  4. public static function Encrypt($string,$salt = null);
  5. public static function Test($string,$digest);
  6. }
  7. class uCryptBlowfish implements iCrypt {
  8. public static function CanUse() { return (defined('CRYPT_BLOWFISH') && CRYPT_BLOWFISH == 1); }
  9. public static function CreateSalt() {
  10. return '$2a$06$'.uCrypt::GetRandom(22,'./abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789').'$';
  11. }
  12. public static function Encrypt($string,$salt = null) {
  13. if ($salt === null) $salt = self::CreateSalt();
  14. return crypt($string,$salt);
  15. }
  16. public static function Test($string,$digest) {
  17. return (crypt($string, $digest) === $digest);
  18. }
  19. }
  20. uCrypt::RegisterClass('uCryptBlowfish');
  21. class uCryptSHA512 implements iCrypt {
  22. public static function CanUse() { return (defined('CRYPT_SHA512') && CRYPT_SHA512 == 1); }
  23. public static function CreateSalt() {
  24. return '$6$rounds=5000$'.uCrypt::GetRandom(16,'./abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789').'$';
  25. }
  26. public static function Encrypt($string,$salt = null) {
  27. if ($salt === null) $salt = self::CreateSalt();
  28. return crypt($string,$salt);
  29. }
  30. public static function Test($string,$digest) {
  31. return (crypt($string, $digest) === $digest);
  32. }
  33. }
  34. uCrypt::RegisterClass('uCryptSHA512');
  35. class uCryptSHA256 implements iCrypt {
  36. public static function CanUse() { return (defined('CRYPT_SHA256') && CRYPT_SHA256 == 1); }
  37. public static function CreateSalt() {
  38. return '$5$rounds=5000$'.uCrypt::GetRandom(16,'./abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789').'$';
  39. }
  40. public static function Encrypt($string,$salt = null) {
  41. if ($salt === null) $salt = self::CreateSalt();
  42. return crypt($string,$salt);
  43. }
  44. public static function Test($string,$digest) {
  45. return (crypt($string, $digest) === $digest);
  46. }
  47. }
  48. uCrypt::RegisterClass('uCryptSHA256');
  49. class uCryptMD5 implements iCrypt {
  50. public static function CanUse() { return true; }
  51. public static function CreateSalt() {
  52. return '$1$'.uCrypt::GetRandom(12,'./abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789');
  53. }
  54. public static function Encrypt($string,$salt = null) {
  55. if ($salt === null) $salt = self::CreateSalt();
  56. return crypt($string,$salt);
  57. }
  58. public static function Test($string,$digest) {
  59. if (substr($digest,0,3) !== '$1$') return (md5($string) === $digest);
  60. return (crypt($string, $digest) === $digest);
  61. }
  62. }
  63. uCrypt::RegisterClass('uCryptMD5',99999);
  64. class uCryptPlain implements iCrypt {
  65. public static function CanUse() { return true; }
  66. public static function Encrypt($string,$salt = null) {
  67. return $string;
  68. }
  69. public static function Test($string,$digest) {
  70. return $string === $digest;
  71. }
  72. }
  73. uCrypt::RegisterClass('uCryptPlain',999999);
  74. class uCrypt {
  75. public static function GetRandom($length,$charset = 'abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ123456789') {
  76. $charset = str_shuffle($charset);
  77. return substr($charset,0,$length);
  78. }
  79. public static function Encrypt($string,$salt = null) {
  80. foreach (self::$classes as $class=>$order) {
  81. $result = call_user_func($class.'::Encrypt',$string,$salt);
  82. if ($result && strlen($result) > 13) return $result;
  83. }
  84. // fallback
  85. return crypt($string);
  86. }
  87. public static function Test($string,$digest) {
  88. foreach (self::$classes as $class=>$order) {
  89. $result = call_user_func($class.'::Test',$string,$digest);
  90. if ($result === true) return true;
  91. }
  92. return false;
  93. }
  94. public static function IsStrongest($string,$digest) { // only works if combination is correct
  95. reset(self::$classes);
  96. $class = key(self::$classes);
  97. $result = call_user_func($class.'::Test',$string,$digest);
  98. return ($result === true);
  99. }
  100. private static $classes = array();
  101. public static function RegisterClass($class, $order=null) {
  102. if (!call_user_func($class.'::CanUse')) return false;
  103. if ($order === null) $order = count(self::$classes);
  104. self::$classes[$class] = $order;
  105. asort(self::$classes);
  106. return true;
  107. }
  108. }