ΠΠ΄ΠΈΠ½ Π΄Π΅Π½ ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΡΠΊΠ°Π½ΠΈΡΠ°ΠΌ Wi-Fi ΠΌΡΠ΅ΠΆΠΈ ΠΎΡ Android ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Π΄Π° ΠΏΠΎΠ»ΡΡΠ° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π·Π° ΡΠΎΡΠΊΠΈΡΠ΅ Π·Π° Π΄ΠΎΡΡΡΠΏ.
Π’ΡΠΊ ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ°ΠΌΠ΅ Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΡΠ΄Π½ΠΎΡΡΠΈ:
Π’Π°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΎΠ±ΡΡΠΆΠ΄Π° ΠΊΠ°ΠΊ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΈΠ·ΡΠ΅ΡΠΏΠ°ΡΠ΅Π»Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π·Π° Wi-Fi ΡΡΠ΅Π΄Π°ΡΠ° ΠΎΡ Android ΠΊΠΎΠ΄ Π±Π΅Π· NDK, Ρ Π°ΠΊΠΎΠ²Π΅, Π½ΠΎ ΡΠ°ΠΌΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Android API ΠΈ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠ°ΡΠ΅.
ΠΠ΅ΠΊΠ° Π½Π΅ ΠΎΡΠ»Π°Π³Π°ΠΌΠ΅ ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Π΄Π° ΠΏΠΈΡΠ΅ΠΌ ΠΊΠΎΠ΄.
1. Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡ
Π’Π°Π·ΠΈ Π±Π΅Π»Π΅ΠΆΠΊΠ° Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π·Π° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ° ΡΡΠ·Π΄Π°Π»ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ Π·Π° Android ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Π²Π΅Π΄Π½ΡΠΆ, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΠΌΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈΡΠ΅ Π·Π° ΡΠΎΠ·ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ. ΠΠΎΠ΄ΡΡ ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ Π² Kotlin, minSdkVersion=23.
2. Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π° Π΄ΠΎΡΡΡΠΏ
ΠΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Ρ Wi-Fi ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ. Π ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΡΡΡ
Π ΡΠ°ΠΊΠ°, Π² AndroidManifest.xml ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ:
<uses-permission android_name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android_name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android_name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android_name="android.permission.ACCESS_FINE_LOCATION"/>
Π Π² ΠΊΠΎΠ΄Π°, ΠΊΠΎΠΉΡΠΎ ΡΡΠ΄ΡΡΠΆΠ° Π²ΡΡΠ·ΠΊΠ° ΠΊΡΠΌ ΡΠ΅ΠΊΡΡΠ°ΡΠ° Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡ:
import android.app.Activity
import android.content.Context
import android.location.LocationManager
import androidx.core.app.ActivityCompat
....
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CHANGE_WIFI_STATE),
1
)
makeEnableLocationServices(activity.applicationContext)
} else {
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.CHANGE_WIFI_STATE),
1
)
}
/* Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΡΠΊΡΠ°Π½ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ»ΡΠΆΠ±Ρ ΠΏΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΌΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ */
fun makeEnableLocationServices(context: Context) {
// TODO: ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π°Π΄ΠΎ ΡΠ°ΡΡΠΊΠ°Π·Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π·Π°ΡΠ΅ΠΌ ΠΠ°ΠΌ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΌΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
val lm: LocationManager =
context.applicationContext.getSystemService(Context.LOCATION_SERVICE) as LocationManager
val gpsEnabled: Boolean = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
val networkEnabled: Boolean = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!gpsEnabled && !networkEnabled) {
context.startActivity(Intent(ACTION_LOCATION_SOURCE_SETTINGS));
}
}
3. Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ BroadcastReceiver ΠΈ ΡΠ΅ Π°Π±ΠΎΠ½ΠΈΡΠ°ΠΉΡΠ΅ Π·Π° ΡΡΠ±ΠΈΡΠΈΡ Π·Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ Π½Π° Wi-Fi ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° ΡΡΠ΅Π΄Π°
val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
val wifiScanReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
if (success) {
scanSuccess()
}
}
}
val intentFilter = IntentFilter()
/* ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΡ Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ Π½ΠΎΠ²ΡΡ
ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ */
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
context.registerReceiver(wifiScanReceiver, intentFilter)
val success = wifiManager.startScan()
if (!success) {
/* ΡΡΠΎ-ΡΠΎ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ Π²ΡΠ΄Π°Π½ΡΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ */
}
....
private fun scanSuccess() {
/* Π²ΠΎΡ ΠΎΠ½ΠΈ, ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ */
val results: List<ScanResult> = wifiManager.scanResults
}
ΠΠ΅ΡΠΎΠ΄ΡΡ WiFiManager.startScan Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π΅ ΠΌΠ°ΡΠΊΠΈΡΠ°Π½ ΠΊΠ°ΡΠΎ ΠΎΡΠΌΠ΅Π½Π΅Π½ ΠΎΡ API Π²Π΅ΡΡΠΈΡ 28, Π½ΠΎ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½.
ΠΠ°ΡΠΎ ΡΡΠ»ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡ
ΠΌΠ΅ ΡΠΏΠΈΡΡΠΊ Ρ ΠΎΠ±Π΅ΠΊΡΠΈ
4. ΠΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅ ScanResult ΠΈ ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡΡΠ°
ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½ΡΠΊΠΎΠΈ ΠΏΠΎΠ»Π΅ΡΠ° ΠΎΡ ΡΠΎΠ·ΠΈ ΠΊΠ»Π°Ρ ΠΈ Π΄Π° ΠΎΠΏΠΈΡΠ΅ΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π°Ρ:
SSID β Service Set Identifier Π΅ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ°
BSSID β Basic Service Set Identifier β MAC Π°Π΄ΡΠ΅Ρ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ Π°Π΄Π°ΠΏΡΠ΅Ρ (Wi-Fi ΡΠΎΡΠΊΠ°)
Π½ΠΈΠ²ΠΎ β ΠΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡ Π·Π° ΡΠΈΠ»Π°ΡΠ° Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π» [dBm (Π½Π° ΡΡΡΠΊΠΈ dBm) β ΠΠ΅ΡΠΈΠ±Π΅Π», ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ½Π° ΠΌΠΎΡΠ½ΠΎΡΡ 1 mW.] β ΠΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡ Π·Π° ΡΠΈΠ»Π°ΡΠ° Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π». ΠΡΠΈΠ΅ΠΌΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ ΠΎΡ 0 Π΄ΠΎ -100, ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΏΠΎ-Π΄Π°Π»Π΅ΡΠ΅ ΠΎΡ 0, ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΌΠΎΡΠ½ΠΎΡΡ Π½Π° ΡΠΈΠ³Π½Π°Π»Π° ΡΠ΅ Π³ΡΠ±ΠΈ ΠΏΠΎ ΠΏΡΡΡ ΠΎΡ Wi-Fi ΡΠΎΡΠΊΠ°ΡΠ° Π΄ΠΎ Π²Π°ΡΠ΅ΡΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ. ΠΠΎΠ²Π΅ΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π½Π°
val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
val numberOfLevels = 5
val level = WifiManager.calculateSignalLevel(level, numberOfLevels)
ΡΠ΅ΡΡΠΎΡΠ° β ΡΠ°Π±ΠΎΡΠ½Π° ΡΠ΅ΡΡΠΎΡΠ° Π½Π° Wi-Fi ΡΠΎΡΠΊΠ°ΡΠ° [Hz]. Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ ΡΠ°ΠΌΠ°ΡΠ° ΡΠ΅ΡΡΠΎΡΠ°, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°ΡΠ΅ ΠΎΡ ΡΠ°ΠΊΠ° Π½Π°ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠ°Π½Π°Π». ΠΡΡΠΊΠ° ΡΠΎΡΠΊΠ° ΠΈΠΌΠ° ΡΠ²ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° ΡΠ°Π±ΠΎΡΠ½Π° ΡΠΈΡΡΠΎΡΠ°. ΠΡΠΌ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π½Π° ΠΏΠΈΡΠ°Π½Π΅ Π½Π°ΠΉ-ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΈΡΡ ΠΎΠ±Ρ
Π²Π°Ρ Π½Π° Wi-Fi ΡΠΎΡΠΊΠΈ Π΅ 2.4 GHz. ΠΠΎ, Π·Π° Π΄Π° Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎ-ΡΠΎΡΠ½ΠΈ, ΡΠΎΡΠΊΠ°ΡΠ° ΠΏΡΠ΅Π΄Π°Π²Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΊΡΠΌ Π²Π°ΡΠΈΡ ΡΠ΅Π»Π΅ΡΠΎΠ½ Π½Π° Π½ΠΎΠΌΠ΅ΡΠΈΡΠ°Π½Π° ΡΠ΅ΡΡΠΎΡΠ°, Π±Π»ΠΈΠ·ΠΊΠ° Π΄ΠΎ ΠΏΠΎΡΠΎΡΠ΅Π½Π°ΡΠ°. ΠΡΠΎΠΉ ΠΊΠ°Π½Π°Π»ΠΈ ΠΈ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ ΠΈΠΌ ΡΠ΅ΡΡΠΎΡΠΈ
/* ΠΏΠΎ ΡΠ°ΡΡΠΎΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Π½ΠΎΠΌΠ΅Ρ ΠΊΠ°Π½Π°Π»Π° */
val channel: Int
get() {
return if (frequency in 2412..2484) {
(frequency - 2412) / 5 + 1
} else if (frequency in 5170..5825) {
(frequency - 5170) / 5 + 34
} else {
-1
}
}
Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ - Π½Π°ΠΉ-ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΡΠΎ ΠΏΠΎΠ»Π΅ Π·Π° Π°Π½Π°Π»ΠΈΠ·, ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ ΠΊΠΎΠ΅ΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π°ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅. Π’ΡΠΊ Π² ΡΠ΅Π΄Π° ΡΠ° Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ βΠ²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅β Π½Π° ΡΠΎΡΠΊΠ°ΡΠ°. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ Π½Π΅ Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° ΡΡΡΡΠΈΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π·Π° ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΈΡΡΠ° Π½Π° Π½ΠΈΠ·ΠΎΠ²Π΅ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ°. ΠΡΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Π² ΡΠΎΠ·ΠΈ ΡΠ΅Π΄:
[WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP+CCMP][WPS][ESS]
[WPA2-PSK-CCMP][ESS]
[WPA2-PSK-CCMP+TKIP][ESS]
[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]
[ESS][WPS]
5. Π Π°Π·Π±ΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠΊΡΠ°ΡΠ΅Π½ΠΈΡΡΠ° ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π·Π° Π°Π½Π°Π»ΠΈΠ·
Π‘ΡΡΡΠ²Π° ΡΠΈ Π΄Π° ΡΠ΅ ΡΠΏΠΎΠΌΠ΅Π½Π΅, ΡΠ΅ ΠΊΠ»Π°ΡΠΎΠ²Π΅ΡΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ° android.net.wifi.* ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠ°ΠΊΠ° ΠΎΡ ΠΏΠΎΠΌΠΎΡΠ½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π½Π° Linux
Π©Π΅ Π΄Π΅ΠΉΡΡΠ²Π°ΠΌΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ. ΠΠ΅ΠΊΠ° ΠΏΡΡΠ²ΠΎ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΈΠ·Ρ ΠΎΠ΄Π° Π½Π° ΡΠΎΡΠΌΠ°Ρ, Π² ΠΊΠΎΠΉΡΠΎ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ΅ Π² ΡΠΊΠΎΠ±ΠΈ ΡΠ° ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈ ΡΡΡ Π·Π½Π°ΠΊ β-β:
[WPA-PSK-TKIP+CCMP]
[WPA2-PSK-CCMP]
ΠΡΡΠ²ΠΎΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎΠΏΠΈΡΠ²Π° Ρ.Π½Π°Ρ. ΠΌΠ΅ΡΠΎΠ΄ Π·Π° ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅. Π’ΠΎΠ΅ΡΡ, ΠΊΠ°ΠΊΠ²Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ ΠΎΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π²ΡΡΡΠ°Ρ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎ ΠΈ ΡΠΎΡΠΊΠ°ΡΠ° Π·Π° Π΄ΠΎΡΡΡΠΏ, Π·Π° Π΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ ΡΠΎΡΠΊΠ°ΡΠ° Π·Π° Π΄ΠΎΡΡΡΠΏ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° ΠΈ ΠΊΠ°ΠΊ Π΄Π° ΡΠΈΡΡΠΎΠ²Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΈΡ ΡΠΎΠ²Π°Ρ. ΠΡΠΌ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π½Π° ΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π½Π°ΠΉ-ΡΠ΅ΡΡΠΎ ΡΡΠ΅ΡΠ°Π½ΠΈΡΠ΅ ΠΎΠΏΡΠΈΠΈ ΡΠ° WPA ΠΈ WPA2, ΠΏΡΠΈ ΠΊΠΎΠΈΡΠΎ ΠΈΠ»ΠΈ Π²ΡΡΠΊΠΎ ΡΠ²ΡΡΠ·Π°Π½ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΈΠ»ΠΈ ΡΡΠ΅Π· Ρ.Π½Π°Ρ. RADIUS ΡΡΡΠ²ΡΡΡΡ (WPA-Enterprice) ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΏΠ°ΡΠΎΠ»Π°ΡΠ° ΠΏΡΠ΅Π· ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½ ΠΊΠ°Π½Π°Π». ΠΠ°ΠΉ-Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΡΠΎΡΠΊΠ°ΡΠ° Π·Π° Π΄ΠΎΡΡΡΠΏ Π²ΡΠ² Π²Π°ΡΠΈΡ Π΄ΠΎΠΌ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π²ΡΡΠ·ΠΊΠ° ΠΏΠΎ ΡΠ°Π·ΠΈ ΡΡ Π΅ΠΌΠ°. Π Π°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠΎΡΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ ΠΈ ΠΏΡΡΠ²Π°ΡΠ° Π΅, ΡΠ΅ ΠΈΠΌΠ° ΠΏΠΎ-ΡΠΈΠ»Π΅Π½ ΡΠΈΡΡΡ: AES ΡΡΠ΅ΡΡ Π½Π΅ΡΠΈΠ³ΡΡΠ½ΠΈΡ TKIP. WPA3, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ΅Π½ ΠΈ ΡΡΡΠ²ΡΡΡΠ΅Π½ΡΡΠ²Π°Π½, ΡΡΡΠΎ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ ΡΠ΅ Π²ΡΠ²Π΅ΠΆΠ΄Π°. Π’Π΅ΠΎΡΠ΅ΡΠΈΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Π²Π°ΡΠΈΠ°Π½Ρ Ρ ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΎΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ CCKM (Cisco Centralized Key Management), Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ ΡΡΠΌ Π³ΠΎ ΡΡΠ΅ΡΠ°Π».
Π’ΠΎΡΠΊΠ°ΡΠ° Π·Π° Π΄ΠΎΡΡΡΠΏ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π° Π΄Π° ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π° ΡΡΠ΅Π· MAC Π°Π΄ΡΠ΅Ρ. ΠΠ»ΠΈ, Π°ΠΊΠΎ ΡΠΎΡΠΊΠ°ΡΠ° Π·Π° Π΄ΠΎΡΡΡΠΏ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π΄Π°Π½Π½ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΎΡΡΠ°ΡΠ΅Π»ΠΈΡ WEP Π°Π»Π³ΠΎΡΠΈΡΡΠΌ, ΡΠΎΠ³Π°Π²Π° Π²ΡΡΡΠ½ΠΎΡΡ Π½ΡΠΌΠ° ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ (ΡΠ°ΠΉΠ½ΠΈΡΡ ΠΊΠ»ΡΡ ΡΡΠΊ Π΅ ΠΊΠ»ΡΡΡΡ Π·Π° ΡΠΈΡΡΠΎΠ²Π°Π½Π΅). ΠΠΈΠ΅ ΠΊΠ»Π°ΡΠΈΡΠΈΡΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΊΠΈΠ²Π° ΠΎΠΏΡΠΈΠΈ ΠΊΠ°ΡΠΎ ΠΠ Π£ΠΠ.
ΠΠΌΠ° ΠΈ ΠΌΠ΅ΡΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ΅Π½ Π² ΠΏΡΠ±Π»ΠΈΡΠ½ΠΈΡΠ΅ wi-fi ΡΡΡ ΡΠΊΡΠΈΡ Captive Portal Detection - Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ ΠΏΡΠ΅Π· Π±ΡΠ°ΡΠ·ΡΡ. Π’Π°ΠΊΠΈΠ²Π° ΡΠΎΡΠΊΠΈ Π·Π° Π΄ΠΎΡΡΡΠΏ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°Ρ Π½Π° ΡΠΊΠ΅Π½Π΅ΡΠ° ΠΊΠ°ΡΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ΠΈ (ΠΊΠ°ΠΊΠ²ΠΈΡΠΎ ΡΠ° ΠΎΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠ°ΡΠ° Π²ΡΡΠ·ΠΊΠ°). ΠΠ°ΡΠΎΠ²Π° Π³ΠΈ ΠΊΠ»Π°ΡΠΈΡΠΈΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠ°ΡΠΎ ΠΠ’ΠΠΠ ΠΠΠ.
ΠΡΠΎΡΠ°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΎΠ·Π½Π°ΡΠ΅Π½Π° ΠΊΠ°ΡΠΎ Π°Π»Π³ΠΎΡΠΈΡΡΠΌ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ»ΡΡΠΎΠ²Π΅. Π’ΠΎΠ²Π° Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π½Π° ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΠΎ-Π³ΠΎΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ Π·Π° ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅. ΠΠΎΠ²ΠΎΡΠΈ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΡΠΎΡΠ½ΠΎ ΡΠ΅ ΠΎΠ±ΠΌΠ΅Π½ΡΡ ΠΊΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ Π·Π° ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅. ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΠΈ. EAP - ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ Π² ΡΠΏΠΎΠΌΠ΅Π½Π°ΡΠΈΡ WPA-Enterprice, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ Π·Π° ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅. SAE - ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ Π² ΡΡΡΠ²ΡΡΡΠ΅Π½ΡΡΠ²Π°Π½ WPA3, ΠΏΠΎ-ΡΡΡΠΎΠΉΡΠΈΠ² Π½Π° Π³ΡΡΠ±Π° ΡΠΈΠ»Π°. PSK - Π½Π°ΠΉ-ΡΠ΅ΡΡΠΎ ΡΡΠ΅ΡΠ°Π½ΠΈΡΡ Π²Π°ΡΠΈΠ°Π½Ρ, Π²ΠΊΠ»ΡΡΠ²Π° Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΠ°ΡΠΎΠ»Π° ΠΈ ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ΡΠΎ ΠΉ Π² ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π° ΡΠΎΡΠΌΠ°. IEEE8021X - ΠΏΠΎ ΠΌΠ΅ΠΆΠ΄ΡΠ½Π°ΡΠΎΠ΄Π΅Π½ ΡΡΠ°Π½Π΄Π°ΡΡ (ΡΠ°Π·Π»ΠΈΡΠ΅Π½ ΠΎΡ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈΡ ΠΎΡ ΡΠ°ΠΌΠΈΠ»ΠΈΡΡΠ° WPA). OWE (Opportunistic Wireless Encryption) Π΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ° IEEE 802.11 Π·Π° ΡΠΎΡΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΊΠ»Π°ΡΠΈΡΠΈΡΠΈΡΠ°Ρ ΠΌΠ΅ ΠΊΠ°ΡΠΎ ΠΠ’ΠΠΠ ΠΠΠ. OWE Π³Π°ΡΠ°Π½ΡΠΈΡΠ° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅, ΠΏΡΠ΅Π΄Π°Π²Π°Π½ΠΈ ΠΏΡΠ΅Π· Π½Π΅Π·Π°ΡΠΈΡΠ΅Π½Π° ΠΌΡΠ΅ΠΆΠ°, ΠΊΠ°ΡΠΎ Π³ΠΈ ΠΊΡΠΈΠΏΡΠΈΡΠ°. ΠΡΠ·ΠΌΠΎΠΆΠ½Π° Π΅ ΠΈ ΠΎΠΏΡΠΈΡ, ΠΊΠΎΠ³Π°ΡΠΎ Π½ΡΠΌΠ° ΠΊΠ»ΡΡΠΎΠ²Π΅ Π·Π° Π΄ΠΎΡΡΡΠΏ, Π½Π΅ΠΊΠ° Π½Π°ΡΠ΅ΡΠ΅ΠΌ ΡΠ°Π·ΠΈ ΠΎΠΏΡΠΈΡ ΠΠ―ΠΠ.
Π’ΡΠ΅ΡΠΈΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΅ Ρ.Π½Π°Ρ. ΡΡ Π΅ΠΌΠΈ Π·Π° ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ β ΠΊΠ°ΠΊ ΡΠΎΡΠ½ΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠΈΡΡΡΡΡ Π·Π° Π·Π°ΡΠΈΡΠ° Π½Π° ΠΏΡΠ΅Π΄Π°Π²Π°Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ. ΠΠ΅ΠΊΠ° ΠΈΠ·Π±ΡΠΎΠΈΠΌ ΠΎΠΏΡΠΈΠΈΡΠ΅. WEP - ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° RC4 ΠΏΠΎΡΠΎΡΠ΅Π½ ΡΠΈΡΡΡ, ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΈΡΡ ΠΊΠ»ΡΡ Π΅ ΠΊΠ»ΡΡΡΡ Π·Π° ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΡΡΠΈΡΠ° Π·Π° Π½Π΅ΠΏΡΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎ Π² ΡΠ²Π΅ΡΠ° Π½Π° ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½Π°ΡΠ° ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡ. TKIP - ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ Π² WPA, CKIP - Π² WPA2. TKIP+CKIP - ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠΎΡΠΈ Π² ΡΠΎΡΠΊΠΈ Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° WPA ΠΈ WPA2 Π·Π° ΠΎΠ±ΡΠ°ΡΠ½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ.
ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΡΠ°ΠΌΠΎΡΠ΅Π½ WEP Π·Π½Π°ΠΊ:
[WEP]
ΠΠ°ΠΊΡΠΎ ΠΎΠ±ΡΡΠ΄ΠΈΡ ΠΌΠ΅ ΠΏΠΎ-Π³ΠΎΡΠ΅, ΡΠΎΠ²Π° Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ, Π·Π° Π΄Π° Π½Π΅ ΡΠ΅ ΡΠΊΠ°Π·Π²Π° Π°Π»Π³ΠΎΡΠΈΡΡΠΌΡΡ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠ»ΡΡΠΎΠ²Π΅, ΠΊΠΎΠΉΡΠΎ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°, ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΡΡ Π½Π° ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅, ΠΊΠΎΠΉΡΠΎ Π΅ ΡΡΡΠΈΡΡ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅.
Π‘Π΅Π³Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΉΡΠ΅ ΡΠ°Π·ΠΈ ΡΠΊΠΎΠ±Π°:
[ESS]
Π’ΠΎ Wi-Fi ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΠ°Π±ΠΎΡΠ° ΠΈΠ»ΠΈ Π’ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡ Π½Π° Wi-Fi ΠΌΡΠ΅ΠΆΠ°ΡΠ°. ΠΠΎΠΆΠ΅ Π΄Π° ΡΡΠ΅ΡΠ½Π΅ΡΠ΅ ΡΠ΅ΠΆΠΈΠΌ BSS (ΠΡΠ½ΠΎΠ²Π΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ ΡΡΠ»ΡΠ³ΠΈ) - ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΠΌΠ° Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π·Π° Π΄ΠΎΡΡΡΠΏ, ΡΡΠ΅Π· ΠΊΠΎΡΡΠΎ ΡΠ²ΡΡΠ·Π°Π½ΠΈΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠΈΡΠ°Ρ. ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈ Π² Π»ΠΎΠΊΠ°Π»Π½ΠΈΡΠ΅ ΠΌΡΠ΅ΠΆΠΈ. ΠΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΠΎΡΠΊΠΈΡΠ΅ Π·Π° Π΄ΠΎΡΡΡΠΏ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π»ΠΎΠΊΠ°Π»Π½ΠΈ ΠΌΡΠ΅ΠΆΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ΅ ΡΠ° ΡΠ°ΡΡ ΠΎΡ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡΠ΅ Π½Π°Π±ΠΎΡΠΈ ΠΎΡ ΡΡΠ»ΡΠ³ΠΈ - ESS. Π’ΠΈΠΏΡΡ IBSS (Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ Π½Π°Π±ΠΎΡΠΈ ΠΎΡ ΡΡΠ»ΡΠ³ΠΈ) ΠΏΠΎΠΊΠ°Π·Π²Π°, ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎ Π΅ ΡΠ°ΡΡ ΠΎΡ ΠΌΡΠ΅ΠΆΠ° Peer-to-Peer.
ΠΠΎΠΆΠ΅ ΡΡΡΠΎ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ WPS ΡΠ»Π°Π³Π°:
[WPS]
WPS (Wi-Fi Protected Setup) Π΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Π·Π° ΠΏΠΎΠ»ΡΠ°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° Wi-Fi ΠΌΡΠ΅ΠΆΠ°. ΠΠ° Π΄Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°, ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ ΠΈΠ»ΠΈ Π²ΡΠ²Π΅ΠΆΠ΄Π° ΠΏΠ°ΡΠΎΠ»Π° ΠΎΡ 8 Π·Π½Π°ΠΊΠ°, ΠΈΠ»ΠΈ Π½Π°ΡΠΈΡΠΊΠ° Π±ΡΡΠΎΠ½ Π½Π° ΡΡΡΠ΅ΡΠ°. ΠΠΊΠΎ Π²Π°ΡΠ°ΡΠ° ΡΠΎΡΠΊΠ° Π·Π° Π΄ΠΎΡΡΡΠΏ Π΅ ΠΎΡ ΠΏΡΡΠ²ΠΈΡ ΡΠΈΠΏ ΠΈ ΡΠΎΠ²Π° ΠΏΠΎΠ»Π΅ Π·Π° ΠΎΡΠΌΠ΅ΡΠΊΠ° ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π²Π° Π΄ΠΎ ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π²Π°ΡΠ°ΡΠ° ΡΠΎΡΠΊΠ° Π·Π° Π΄ΠΎΡΡΡΠΏ, ΡΠΈΠ»Π½ΠΎ ΡΠ΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π° Π΄Π° ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Π² Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΈΠ²Π½ΠΈΡ ΠΏΠ°Π½Π΅Π» ΠΈ Π΄Π° Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ° Π΄ΠΎ WPS. Π€Π°ΠΊΡ Π΅, ΡΠ΅ ΡΠ΅ΡΡΠΎ 8-ΡΠΈΡΡΠ΅Π½ΠΈΡΡ ΠΠΠ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΎΡΠΊΡΠΈΡ ΠΏΠΎ MAC Π°Π΄ΡΠ΅ΡΠ° ΠΈΠ»ΠΈ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ Π² ΠΎΠ±ΠΎΠ·ΡΠΈΠΌΠΎ Π²ΡΠ΅ΠΌΠ΅, ΠΎΡ ΠΊΠΎΠ΅ΡΠΎ Π½ΡΠΊΠΎΠΉ Π½Π΅ΡΠ΅ΡΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²ΡΠ·ΠΏΠΎΠ»Π·Π²Π°.
6. Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ ΠΌΠΎΠ΄Π΅Π» ΠΈ ΡΡΠ½ΠΊΡΠΈΡ Π·Π° Π°Π½Π°Π»ΠΈΠ·
ΠΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΡΠ°Π·Π±ΡΠ°Ρ ΠΌΠ΅ ΠΏΠΎ-Π³ΠΎΡΠ΅, ΡΠ΅ ΠΎΠΏΠΈΡΠ΅ΠΌ ΡΠ»ΡΡΠΈΠ»ΠΎΡΠΎ ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠ»Π°ΡΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ:
/* ΡΡ
Π΅ΠΌΠ° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ */
enum class AuthMethod {
WPA3,
WPA2,
WPA, // Wi-Fi Protected Access
OTHER, // Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ Shared Key Authentication ΠΈ Π΄Ρ. ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ mac-address-based ΠΈ WEP
CCKM, // Cisco
OPEN // Open Authentication. ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΎ ΡΠΊΡΡΡΡΠΌ Captive Portal Detection - Π·Π°ΠΏΡΠΎΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠ΅ΡΠ΅Π· Π±ΡΠ°ΡΠ·Π΅Ρ
}
/* Π°Π»Π³ΠΎΡΠΈΡΠΌ Π²Π²ΠΎΠ΄Π° ΠΊΠ»ΡΡΠ΅ΠΉ */
enum class KeyManagementAlgorithm {
IEEE8021X, // ΠΏΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΡ
EAP, // Extensible Authentication Protocol, ΡΠ°ΡΡΠΈΡΡΠ΅ΠΌΡΠΉ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ
PSK, // Pre-Shared Key β ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ·Π΅Π» Π²Π²ΠΎΠ΄ΠΈΡ ΠΏΠ°ΡΠΎΠ»Ρ Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ΅ΡΠΈ
WEP, // Π² WEP ΠΏΠ°ΡΠΎΠ»Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠ»ΡΡΠΎΠΌ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ (No auth key)
SAE, // Simultaneous Authentication of Equals - ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π² WPA3
OWE, // Opportunistic Wireless Encryption - Π² ΡΠΎΡΡΠ΅ΡΠ°Ρ
Π½ΠΎΠ²ΡΡ
ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΉ, ΠΏΡΠ±Π»ΠΈΡΠ½ΡΡ
ΡΠ΅ΡΡΡ
ΡΠΈΠΏΠ° OPEN
NONE // ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π±Π΅Π· ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ Π² OPEN, OTHER
}
/* ΠΌΠ΅ΡΠΎΠ΄ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ */
enum class CipherMethod {
WEP, // Wired Equivalent Privacy, ΠΠ½Π°Π»ΠΎΠ³ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ°ΡΠΈΠΊΠ° Π² ΠΏΡΠΎΠ²ΠΎΠ΄Π½ΡΡ
ΡΠ΅ΡΡΡ
TKIP, // Temporal Key Integrity Protocol
CCMP, // Counter Mode with Cipher Block Chaining Message Authentication Code Protocol,
// ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Π±Π»ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ Ρ ΠΊΠΎΠ΄ΠΎΠΌ Π°ΡΡΠ΅Π½ΡΠΈΡΠ½ΠΎΡΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ ΡΠ΅ΠΆΠΈΠΌΠΎΠΌ ΡΡΠ΅ΠΏΠ»Π΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΎΠ² ΠΈ ΡΡΠ΅ΡΡΠΈΠΊΠ°
// Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ AES
NONE // ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π±Π΅Π· ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ Π² OPEN, OTHER
}
/* Π½Π°Π±ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ², ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΡΠΊΠ° */
data class Capability(
var authScheme: AuthMethod? = null,
var keyManagementAlgorithm: KeyManagementAlgorithm? = null,
var cipherMethod: CipherMethod? = null
)
/* Π Π΅ΠΆΠΈΠΌ ΡΠ°Π±ΠΎΡΡ WiFi (ΠΈΠ»ΠΈ ΡΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡ ΡΠ΅ΡΠ΅ΠΉ WiFi) */
enum class TopologyMode {
IBSS, // ΠΠΏΠΈΠ·ΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ΅ΡΡ (Ad-Hoc ΠΈΠ»ΠΈ IBSS β Independent Basic Service Set).
BSS, // ΠΡΠ½ΠΎΠ²Π½Π°Ρ Π·ΠΎΠ½Π° ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ Basic Service Set (BSS) ΠΈΠ»ΠΈ Infrastructure Mode.
ESS // Π Π°ΡΡΠΈΡΠ΅Π½Π½Π°Ρ Π·ΠΎΠ½Π° ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ ESS β Extended Service Set.
}
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΡΠΎ ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ° ΠΏΠΎΠ»Π΅ΡΠΎ Π·Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ:
private fun parseCapabilities(capabilitiesString: String): List < Capability > {
val capabilities: List < Capability > = capabilitiesString
.splitByBrackets()
.filter {
!it.isTopology() && !it.isWps()
}
.flatMap {
parseCapability(it)
}
return
if (!capabilities.isEmpty()) {
capabilities
} else {
listOf(Capability(AuthMethod.OPEN, KeyManagementAlgorithm.NONE, CipherMethod.NONE))
}
}
private fun parseCapability(part: String): List < Capability > {
if (part.contains("WEP")) {
return listOf(Capability(
AuthMethod.OTHER,
KeyManagementAlgorithm.WEP,
CipherMethod.WEP
))
}
val authScheme = when {
part.contains("WPA3") - > AuthMethod.WPA3
part.contains("WPA2") - > AuthMethod.WPA2
part.contains("WPA") - > AuthMethod.WPA
else - > null
}
val keyManagementAlgorithm = when {
part.contains("OWE") - > KeyManagementAlgorithm.OWE
part.contains("SAE") - > KeyManagementAlgorithm.SAE
part.contains("IEEE802.1X") - > KeyManagementAlgorithm.IEEE8021X
part.contains("EAP") - > KeyManagementAlgorithm.EAP
part.contains("PSK") - > KeyManagementAlgorithm.PSK
else - > null
}
val capabilities = ArrayList < Capability > ()
if (part.contains("TKIP") || part.contains("CCMP")) {
if (part.contains("TKIP")) {
capabilities.add(Capability(
authScheme ? : AuthMethod.OPEN,
keyManagementAlgorithm ? : KeyManagementAlgorithm.NONE,
CipherMethod.TKIP
))
}
if (part.contains("CCMP")) {
capabilities.add(Capability(
authScheme ? : AuthMethod.OPEN,
keyManagementAlgorithm ? : KeyManagementAlgorithm.NONE,
CipherMethod.CCMP
))
}
} else if (authScheme != null || keyManagementAlgorithm != null) {
capabilities.add(Capability(
authScheme ? : AuthMethod.OPEN,
keyManagementAlgorithm ? : KeyManagementAlgorithm.NONE,
CipherMethod.NONE
))
}
return capabilities
}
private fun parseTopologyMode(capabilitiesString: String): TopologyMode ? {
return capabilitiesString
.splitByBrackets()
.mapNotNull {
when {
it.contains("ESS") - > TopologyMode.ESS
it.contains("BSS") - > TopologyMode.BSS
it.contains("IBSS") - > TopologyMode.IBSS
else - > null
}
}
.firstOrNull()
}
private fun parseWPSAvailable(capabilitiesString: String): Boolean {
return capabilitiesString
.splitByBrackets()
.any {
it.isWps()
}
}
private fun String.splitByBrackets(): List < String > {
val m = Pattern.compile("[(.*?)]").matcher(this)
val parts = ArrayList < String > ()
while (m.find()) {
parts.add(m.group().replace("[", "").replace("]", ""))
}
return parts
}
private fun String.isTopology(): Boolean {
return TopologyMode.values().any {
this == it.name
}
}
private fun String.isWps(): Boolean {
return this == "WPS"
}
8. ΠΠΈΠΆΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ°
Π©Π΅ ΡΠΊΠ°Π½ΠΈΡΠ°ΠΌ ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΠΈ ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΡΠΊΡΠΈΡ . ΠΠΎΠΊΠ°Π·Π°Π½ΠΈ ΡΠ° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΠΈΠ·Ρ ΠΎΠ΄ ΡΡΠ΅Π· Log.d:
Capability of Home-Home [WPA2-PSK-CCMP][ESS][WPS]
...
capabilities=[Capability(authScheme=WPA2, keyManagementAlgorithm=PSK, cipherMethod=CCMP)], topologyMode=ESS, availableWps=true
ΠΡΠΏΡΠΎΡΡΡ Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ ΠΊΡΠΌ ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΠΎΡ ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΎΡΡΠ°Π½Π° Π½Π΅ΡΠ°Π·Π³Π»Π΅Π΄Π°Π½. Π©Π΅ ΠΊΠ°ΠΆΠ° ΡΠ°ΠΌΠΎ, ΡΠ΅ Π·Π° Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ Π·Π°ΠΏΠ°Π·Π΅Π½ΠΈ ΠΏΠ°ΡΠΎΠ»ΠΈ ΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π½Π° ΠΌΠΎΠ±ΠΈΠ»Π½ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ, ΠΈΠΌΠ°ΡΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΠΏΡΠ°Π²Π° Π½Π° root ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π΄Π° ΡΠ΅ ΡΠΎΠ²ΠΈΡΠ΅ Π²ΡΠ² ΡΠ°ΠΉΠ»ΠΎΠ²Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°, Π·Π° Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ wpa_supplicant.conf. ΠΠΊΠΎ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π° Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΠ°ΡΠΎΠ»Π° ΠΎΡΠ²ΡΠ½, Π²ΡΡΠ·ΠΊΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈ ΠΏΡΠ΅Π· ΠΊΠ»Π°ΡΠ°
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ
ΠΠΊΠΎ ΡΠΌΡΡΠ°ΡΠ΅, ΡΠ΅ Π½Π΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°, Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ :)
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com