Sodium 是 PHP 中用于加密、解密和生成哈希的现代加密库。它提供了一组易于使用的加密工具,能够帮助开发者实现安全的数据存储和通信。以下是一些简单的用法示例: <? php // 生成随机密钥 $encryption_key = sodium_crypto_secretbox_keygen(); // 要加密的数据 $message = "Hello, Sodium ; // 生成随机的 nonce $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); // 加密数据 $ciphertext = sodium_crypto_secretbox ($message, $nonce, $encryption_key); // 解密数据 $plaintext = sodium_crypto_secretbox_open($ciphertext, > 生成哈希 $password = "my_secret_password"; $hash = sodium_crypto_generichash($password); echo "原始密码: $
PHP的Sodium加密扩展函数了解 这是本次加密扩展系列的最后一篇文章,也是我们要学习了解的最后一个 PHP 加密扩展。Sodium 出现的目的也是为了代替 Mcrypt 这个原来的加密扩展。 不过,Sodium 扩展的应用也并不是很多,大部分情况下我们都会使用 OpenSSL 来进行加密操作,同时,Sodium 扩展提供的函数也非常多,所以,我们这篇文章只做了解即可。 Sodium 扩展在 PHP7.2 后是跟随 PHP 源码一起发布的,只需要在编译的时候加上 --with-sodium 即可安装成功。如果是 PHP7.2 之前的版本,需要单独安装这个扩展。 // 信息签名 $key = sodium_crypto_auth_keygen(); // 生成随机签名密钥 $message = '测试认证签名'; // 生成签名 $signature = sodium_crypto_auth // Hash $password = '测试Hash'; $hash = sodium_crypto_pwhash_str( $password, SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE
不过,Sodium 扩展的应用也并不是很多,大部分情况下我们都会使用 OpenSSL 来进行加密操作,同时,Sodium 扩展提供的函数也非常多 Sodium 扩展在 PHP7.2 后是跟随 PHP 源码一起发布的 修改php.ini extension=sodium.so 查看模块 php -m |grep sodium sodium 简单使用 加密 <? 'iv' => sodium_bin2base64($iv, SODIUM_BASE64_VARIANT_ORIGINAL), 'aad' => sodium_bin2base64($aad , SODIUM_BASE64_VARIANT_ORIGINAL), 'cipher_text' => sodium_bin2base64($encrypt, SODIUM_BASE64 SODIUM_BASE64_VARIANT_ORIGINAL); $cipherText = sodium_base642bin($secretData['cipher_text'], SODIUM_BASE64
源码编译过程中遇到类似如下in文件 #ifndef sodium_version_H #define sodium_version_H #include "export.h" #define SODIUM_VERSION_STRING "@VERSION@" #define SODIUM_LIBRARY_VERSION_MAJOR @SODIUM_LIBRARY_VERSION_MAJOR @ #define SODIUM_LIBRARY_VERSION_MINOR @SODIUM_LIBRARY_VERSION_MINOR@ @SODIUM_LIBRARY_MINIMAL_DEF@ # ifdef __cplusplus extern "C" { #endif SODIUM_EXPORT const char *sodium_version_string(void); SODIUM_EXPORT int sodium_library_version_major(void); SODIUM_EXPORT int sodium_library_version_minor
private final int calories; // optional private final int fat; // (g) optional private final int sodium } public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium ) { this(servingSize, servings, calories, fat, sodium, 0); } public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate) { this.servings = servings; this.calories = calories; this.fat = fat; this.sodium
) { this(servingSize, servings, calories, fat, sodium, 0); } public NutritionFacts(int servingSize ; this.servings = servings; this.calories = calories; this.fat = fat; this.sodium = sodium; =" + sodium + ", carbohydrate=" + carbohydrate + "]"; } } 这么多参数的构造函数,你怎么记得住。 = builder.sodium; carbohydrate = builder.carbohydrate; } @Override public String toString() { =" + sodium + ", carbohydrate=" + carbohydrate + "]"; } } 这个缺点也很明显啊,多了一个builder类。
private final int calories; // 可选 private final int fat; // 可选 private final int sodium fat, 0); } public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium ) { this(servingSize, servings, calories, fat, sodium, 0); } } 虽然这种方法在小范围内可行,但随着可选参数的增多, = builder.sodium; this.carbohydrate = builder.carbohydrate; } public static class Builder int calories = 0; // 默认值 private int fat = 0; // 默认值 private int sodium
private final int calories; // optional private final int fat; // (g) optional private final int sodium ) { this(servingSize, servings, calories, fat, sodium, 0); } public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate) { / Required; no default value private int calories = 0; private int fat = 0; private int sodium (int val) { sodium = val; return this; } public NutritionFacts
serving) optional private final int fat; // (g/serving) optional private final int sodium ) { this(servingSize, servings, calories, fat, sodium, 0); } public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate) { = sodium; this.carbohydrate = carbohydrate; } } 当想要创建一个实例时,可以使用包含所有要设置的参数的最短参数列表的构造方法 下面是客户端代码的示例: NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8) .calories(100).sodium(35
// optional private final int fat; // (g) optional private final int sodium } public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium ) { this(servingSize, servings, calories, fat, sodium, 0); } public NutritionFacts (int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate) { 客户端代码就像下面这样: NutritionFacts coca = new NutritionFacts.Builder(240,8) .calories(100).sodium(35
final int servings; private final int calories; private final int fat; private final int sodium calories = 0; private int fat = 0; private int carbohydrate = 0; private int sodium (int val) { sodium = val; return this; } public NutritionFacts = builder.sodium; carbohydrate = builder.carbohydrate; } } 静态内部类的使用: NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build(); 参考资料 1、Effective
servings;// required private int calories;// optional private int fat;// optional private int sodium //..... } public Nutrition(int servingSize, int servings,int calories, int fat,int sodium { //..... } public Nutrition(int servingSize,int servings,int calories,int fat,int sodium nutrition.setFat(fat); return this; } public AbstractBuilder setSodium(int sodium ){ nutrition.setSodium(sodium); return this; } public AbstractBuilder setCarbohydrate
> data(hotdog) > dim(hotdog) [1] 54 3 > head(hotdog) Type Calories Sodium 1 Beef 186 495 2 :645.0 下面利用该数据集进行协方差分析,由于hotdog中肉质的种类可以人为控制,但肉质的卡路里是难以控制的,故考虑将 Sodium作为响应变量,Calories作为协变量进行方差分析。 > ancova(Sodium ~ Calories,data=hotdog, groups=Type) Analysis of Variance Table Response: Sodium 若考虑变量Type和Calories进行协方差分析,代码如下: > ancova(Sodium ~ Calories + Type, data=hotdog) Analysis of Variance Table Response: Sodium Df Sum Sq Mean Sq F value Pr(>F) Calories 1 106270 106270
= sodium; this.carbohydrate = carbohydrate; } @Override public String toString( =" + sodium + ", carbohydrate=" + carbohydrate + '}'; } public ) { this.sodium = sodium; } public void setCarbohydrate(int carbohydrate) { =" + sodium + ", carbohydrate=" + carbohydrate + '}'; } public = builder.sodium; carbohydrate = builder.carbohydrate; } @Override public String
) { this(servingSize, servings, calories, fat, sodium, 0); } public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate) { = servings; this.calories = calories; this.fat = fat; this.sodium = sodium; this.carbohydrate = carbohydrate; } } 从上面的代码可见,为了尽量满足用户需要,NutritionFacts (int val) { sodium = val; return this; } public NutritionFacts build() {
) { this(servingSize, servings, calories, fat, sodium, 0); } public NutritionFacts(int = sodium; this.carbohydrate = carbohydrate; } } 如上述代码所示,为重叠构造器模式。 ) { this.sodium = sodium; } public void setCarbohydrate(int carbohydrate) { (int sodium) { this.sodium = sodium; return this; } public Builder = builder.sodium; carbohydrate = builder.carbohydrate; } } 如上述代码所示,为Builder模式。
// (per serving) optional private final int fat; // (g/serving) optional private final int sodium ) { this(servingSize, servings, calories, fat, sodium, 0); } public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate) { / Required; no default value private int calories = 0; private int fat = 0; private int sodium = build.sodium; carbohydrate = build.carbohydrate; } } NutritionFacts 类是不可变的,所有的参数默认值都在一个地方
不装也可以正常游玩服务器) Mod名 说明 客户端 服务端 Roughly Enough Items REI 更好的合成菜单 ✅ ❌ continuity 无缝玻璃 ✅ ❌ Iris 新时代光影mod ✅ ❌ Sodium 新时代渲染引擎,客户端优化 ✅ ❌ Indium Sodium附加包(Fabric Rendering API) ✅ ❌ InventoryProfilesNext 背包整理 ✅ ❌ lambdynamiclights 动态光源优化 ✅ ❌ mod menu mod管理 ✅ ❌ pinglist 实时显示ping值 ✅ ❌ Sodium Extra 视频设置控制面板优化 ✅ ❌ Reese’s Sodium Options
calories per serving and over twenty optional fields—total fat, saturated fat, trans fat, cholesterol, sodium ) { this(servingSize, servings, calories, fat, sodium, 0); } public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate) { = sodium; this.carbohydrate = carbohydrate; } } When you want to create an instance, you (int val) { sodium = val; return this; } public NutritionFacts
PHP 环境准备 2.1 GMP 扩展 2.2 sodium 扩展 2.3 修改 php.ini 3.安装扩展 4.登陆测试 0.什么是无密码登录 今年早些时候,苹果联合微软和谷歌发布声明,将扩大对 PHP 环境准备 在为 WordPress 添加支持无密码登录之前,首先需要额外安装一些 PHP 扩展,如 gmp 和 sodium 。 /configure --with-php-config=/usr/local/php/bin/php-config #确认无报错后执行: make && make install 2.2 sodium 扩展 apt install libsodium-dev cd ~/lnmp1.9/src/php-8.1.5/ext/sodium /usr/local/php/bin/phpize . 修改 php.ini nano /usr/local/php/etc/php.ini #在 extension_dir 行下面添加以下两行: extension = gmp extension = sodium