Извиняюсь, конечно, что не совсем по теме, но у меня на JS (WSH на Винде, с Висты, вроде), вот такое решение было и сейчас пользуюсь. Я к чему: не сталкивался тогда в Линуксе с подобной проблемой (если скачивал там, на винду перебрасывал сразу), но на Винде длительность видео можно выцепить через метод GetDetailsOf объекта "Shell.Application" ("Описание: возвращается информация, похожая на ту, что можно увидеть в окне свойств файла (папки) в проводнике"). И повторюсь, насколько помню (давно было), из Линукса данные передавались уже с этими свойствами файла. Скрипт своеобразный - рассчитан под нумерованные папки (оцифровывал VHS кассеты изначально, теперь только при скачивании через yt-dlp использую - он умеет разбивать на фрагменты почти хорошо, а с нужными параметрами почти идеально), но легко поправить. Может, без ffprobe можно и на линуксе обойтись? Давно с ним не работал.
Те, кот использовал Защищённую папку, не рутовал, насколько знаю. Там в этом случае аппаратный предохранитель пережигался и доступ к папке блокировался бы. Я Защищённую папку использую: Госключ там у меня и ЮKassa (они приложение для самозанятых не сделали, только для ЮЛ/ИП, а некоторой минимальной безопасности хочется :) С выходом One UI 7.0 в Samsung резко гайки закрутили. Раньше из Защищённой папки можно было в основное пространство телефона отправлять файлы/ссылки в любое приложение, а теперь только через Быструю отправку - фактически через ссылку в их облаке с ограниченным сроком доступа (можно перекрыть доступ и раньше). Насколько помню, Защищенная папка одобрена DoD и Бундесвером, но надо понимать все ограничения (а они есть) и уметь пользоваться. Но понимаю, что не всем подойдёт, а меня устраивает.
Тоже как-то оцифровывал подобным образом. С шестиголовочного магнитофона захватывал YPbPr сигнал бехолдером 8 (PCI-e 1x). Насколько помню, пришел также в конце концов к захвату в lossless ASF, при записи вручную подстраивал фильтры (нужно было для лучшего качества смотреть на изменение картинки), деинтерлейс делал "на лету" (из всех вариантов, доступных на сайте, был один более или менее подходящий по качеству, как мне показалось), критичной при этом была нагрузка на процессор, настройки фильтров подбирались в том числе исходя из этого. Потом конвертировал ffmpeg в x264 -crf 18. Сейчас, правда при необходимости перекодирую видео видеокартой Nvidia - это намного быстрее, качество вполне устраивает. А в начале захватывал в AVI. Видео со звуком всегда расходилось при этом, причём, насколько помню каждый раз по-разному. Даже скрипт для корректировки расхождения на пайтоне написал исходя из предположения о линейной зависимости, пока не пришёл к описанному выше варианту.
Скрипт: VirtualDub.py
#! python3.5
import bisect
import os
import re
import subprocess
import sys
import threading
import tkinter
from tkinter import ttk
import win32api
import win32com.client
import win32con
import win32console
import win32gui
import mylib
class Application(ttk.Frame):
def __init__(self, master=None):
global padx, pady
super().__init__(master)
master.title(os.path.split(sys.argv[0])[1])
master.resizable(False, False)
# Определим размер шрифта для расчета горизонтальных и вертикальных отступов
ttk.Style().configure("TLabel", font=font)
self.label = ttk.Label(self, text="0" * 2)
self.label.pack()
padx = self.label.winfo_reqwidth()
pady = self.label.winfo_reqheight()
self.label["text"] = self.label["text"][0]
padx -= self.label.winfo_reqwidth()
self.label.destroy()
del self.label
self.correction_value = tkinter.IntVar()
self.correction_value.set(1100)
self.correction_focused = None
self.sign_factor = -1
self.correction0_value = tkinter.IntVar()
self.correction0_value.set(0)
self.sign0_factor = -1
self.correction0_focused = None
self.saved_value = None
self.grid()
self.createWidgets()
def update_application_window(self):
if root.wm_state() == "withdrawn":
x = (root.winfo_screenwidth() - root.winfo_reqwidth()) // 2
y = (root.winfo_screenheight() - root.winfo_reqheight()) // 2
root.wm_geometry("+{0:d}+{1:d}".format(x, y))
root.deiconify() # Делаем видимым основное окно
for suffix in ("", "0"):
correction = getattr(self, "correction{0}".format(suffix))
correction_focused = "focus" in correction.state()
if correction_focused and not getattr(self, "correction{0}_focused".format(suffix)):
correction.select_range(0, "end")
setattr(self, "correction{0}_focused".format(suffix), correction_focused)
state = "disabled" if self.correction_value.get() == self.correction0_value.get() else "normal"
self.hour["state"] = self.minute["state"] = (state, )
self.update_idletasks()
self.update()
self.after(100, self.update_application_window)
def change_sign(self, widget):
def factor():
return "sign{0}_factor".format("0" if correction0 else "")
correction0 = self.nametowidget(widget) in (self.correction0, self.sign0_button)
setattr(self, factor(), -getattr(self, factor()))
button = getattr(self, "sign{0}_button".format("0" if correction0 else ""))
button["text"] = "-" if getattr(self, factor()) < 0 else "+"
def key_return(self, event):
if event.widget == self.run_button:
self.run()
else:
event.widget.tk_focusNext().focus()
next_widget = root.focus_get()
if next_widget == self.sign0_button:
next_widget.tk_focusNext().focus()
next_widget = root.focus_get()
if next_widget in (self.correction, self.correction0, self.hour, self.minute):
next_widget.select_range(0, "end")
def validate_correction(self, widget, data, action):
correction0 = self.nametowidget(widget) == self.correction0
value = getattr(self, "correction{0}_value".format("0" if correction0 else ""))
other_value = getattr(self, "correction{0}_value".format("" if correction0 else "0"))
entry = getattr(self, "correction{0}".format("0" if correction0 else ""))
valid = re.match(r'^\d+$', data) is not None
if action == '0':
self.saved_value = value.get()
elif action == '1':
if not valid:
try:
value.get()
except Exception:
value.set(self.saved_value)
entry.select_range(0, "end")
if data in "-+":
self.change_sign(widget)
elif data == " ":
other_value.set(value.get())
entry.select_range(0, "end")
else:
return False
return valid
def validate_time(self, widget, new_value, data, action):
def process_widget(name, max_value):
widget = getattr(self, name)
if widget.get() == '':
widget.set(self.saved_value)
widget.select_range(0, "end")
if data == "-":
widget.set(str(max(0, int(widget.get()) - 1)))
elif data == "+":
widget.set(str(min(max_value, int(widget.get()) + 1)))
if action == '0':
self.saved_value = self.nametowidget(widget).get()
return True
elif action == '1':
if widget == str(self.hour):
valid = re.match(r'^\d$', new_value) is not None
if not valid:
process_widget('hour', 9)
elif widget == str(self.minute):
valid = re.match(r'^[0-5]?\d$', new_value) is not None
if not valid:
process_widget('minute', 59)
else:
return False
return valid
def run(self, event=None):
config = """VirtualDub.audio.SetSource(1);
VirtualDub.audio.SetMode(1);
VirtualDub.audio.SetInterleave(1,500,1,0,{2});
VirtualDub.audio.SetClipMode(1,1);
VirtualDub.audio.SetConversion(0,0,0,0,1);
VirtualDub.audio.SetVolume();
VirtualDub.audio.SetCompressionWithHint(8192,48000,2,0,32000,1024,"AC3ACM");
VirtualDub.audio.EnableFilterGraph({0});
VirtualDub.video.SetInputFormat(0);
VirtualDub.video.SetOutputFormat(7);
VirtualDub.video.SetMode(0);
VirtualDub.video.SetSmartRendering(0);
VirtualDub.video.SetPreserveEmptyFrames(0);
VirtualDub.video.SetFrameRate2(0,0,1);
VirtualDub.video.SetIVTC(0, 0, 0, 0);
VirtualDub.video.SetCompression();
VirtualDub.video.filters.Clear();
VirtualDub.audio.filters.Clear();
VirtualDub.audio.filters.Add("input");
VirtualDub.audio.filters.Add("time stretch");
VirtualDub.audio.filters.Connect(0, 0, 1, 0);
VirtualDub.audio.filters.instance[1].SetDouble(0, {1:.8});
VirtualDub.audio.filters.Add("output");
VirtualDub.audio.filters.Connect(1, 0, 2, 0);
"""
try:
correction = self.sign_factor * int(self.correction.get())
except ValueError:
threading.Thread(target=mylib.MessageBox, args=('Не задана коррекция!',
win32con.MB_ICONEXCLAMATION, 5)).start()
return
try:
correction0 = self.sign0_factor * int(self.correction0.get())
except ValueError:
threading.Thread(target=mylib.MessageBox, args=('Не задана коррекция нуля!',
win32con.MB_ICONEXCLAMATION, 5)).start()
return
try:
time_span = (int(self.hour.get()) * 60 + int(self.minute.get())) * 60
except ValueError:
time_span = 0
if not time_span:
threading.Thread(target=mylib.MessageBox, args=('Не задано время!',
win32con.MB_ICONEXCLAMATION, 5)).start()
return
if not os.path.exists(PROGRAM):
threading.Thread(target=mylib.MessageBox, args=('Не обнаружен "{0}"!'.format(PROGRAM),
win32con.MB_ICONEXCLAMATION, 5)).start()
return
correction -= correction0
if not correction:
config = re.sub(r'^.*\.audio\.filters\.(?!Clear).*$', '', config, flags=re.MULTILINE).rstrip()
factor = 1.0 + correction / 1000 / time_span
with open(CONFIG_NAME, "w") as config_file:
config_file.write(config.format(1 if correction else 0, factor, correction0))
subprocess.Popen('"' + PROGRAM + '" /s "{0}"'.format(CONFIG_NAME))
self.quit()
def createWidgets(self):
self.config(padding=(padx, int(pady/4)))
style = ttk.Style()
style.configure("TLabel", font=font)
style.configure("TButton", font=font)
style.configure("C.TButton", font=font, foreground="red")
style.configure("TCombobox", font=font)
style.configure("TRadiobutton", font=font)
root.bind('<Key-Return>', self.key_return)
root.bind('<Control-Key-Return>', self.run)
row = 0
self.header = ttk.Label(self, text="Задай коррекцию и время")
self.header.grid(row=row, column=0, columnspan=4)
row += 1
self.correction_label = ttk.Label(self, text="Коррекция(ms)*:")
self.correction_label.grid(row=row, column=0, sticky="e")
self.clear_button = ttk.Button(self, text="C", width=1, style="C.TButton")
self.clear_button["command"] = lambda:self.correction_value.set(0)
self.clear_button.grid(row=row, column=1)
self.sign_button = ttk.Button(self, text="-", width=1)
self.sign_button["command"] = (self.register(self.change_sign), self.sign_button)
self.sign_button.grid(row=row, column=2)
self.correction = ttk.Entry(self, width=5, textvariable=self.correction_value, validate="key",
validatecommand=(self.register(self.validate_correction), '%W', '%S', '%d'))
self.correction.grid(row=row, column=3)
self.correction.focus()
row += 1
self.correction0_label = ttk.Label(self, text="Коррекция нуля(ms)*:")
self.correction0_label.grid(row=row, column=0, columnspan=2, sticky="e")
self.sign0_button = ttk.Button(self, text="-", width=1)
self.sign0_button["command"] = (self.register(self.change_sign), self.sign0_button)
self.sign0_button.grid(row=row, column=2)
self.correction0 = ttk.Entry(self, width=5, textvariable=self.correction0_value, validate="key",
validatecommand=(self.register(self.validate_correction), '%W', '%S', '%d'))
self.correction0.grid(row=row, column=3)
row += 1
self.time_label = ttk.Label(self, text="Время(h:mm):")
self.time_label.grid(row=row, column=0, sticky="e")
self.hour = ttk.Combobox(self, width=1, validate="key",
validatecommand=(self.register(self.validate_time), '%W', '%P', '%S', '%d'))
self.hour["values"] = list(map(lambda x:"{0}".format(x), range(10)))
self.hour.current(0)
self.hour.grid(row=row, column=1)
self.sc1 = ttk.Label(self, text=":")
self.sc1.grid(row=row, column=2)
self.minute = ttk.Combobox(self, width=2, validate="key",
validatecommand=(self.register(self.validate_time), '%W', '%P', '%S', '%d'))
self.minute["values"] = list(map(lambda x:"{0:>02}".format(x*5), range(12)))
self.minute.current(10)
self.minute.grid(row=row, column=3)
row += 1
self.space_label = ttk.Label(self, text="*Space-копировать")
self.space_label.grid(row=row, column=0, sticky="w")
self.run_button = ttk.Button(self, text="Запуск", width=8, command=self.run)
self.run_button.grid(row=row, column=1, columnspan=3, pady=int(pady/4))
self.after(100, self.update_application_window)
if __name__ == "__main__":
FOLDER = os.path.split(sys.argv[0])[0]
PROGRAM = os.path.join(FOLDER, "VirtualDub.exe")
CONFIG_NAME = os.path.join(FOLDER, "config.vcf")
MONIKER = r"winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2"
SCRIPT_TITLE = os.path.split(sys.argv[0])[1]
keep_output = False
COMSPEC = os.getenv("comspec")
if COMSPEC: # Проверим на запуск в режиме сохраниеия вывода после завершения
parent_process_moniker = (MONIKER + ":Win32_Process.Handle=" + str(os.getppid()))
try:
for i in range(2):
parent_process = win32com.client.GetObject(parent_process_moniker)
keep_output += re.match('("?)' + COMSPEC.replace("\\", "\\\\").replace(".", "\\.") + '\\1\s+/[ck]\s+',
parent_process.CommandLine, re.IGNORECASE) is not None
parent_process_moniker = (MONIKER + ":Win32_Process.Handle=" + str(parent_process.ParentProcessId))
except Exception:
pass
finally:
parent_process = None
main_hwnd = win32console.GetConsoleWindow()
if main_hwnd:
if win32api.GetConsoleTitle() != SCRIPT_TITLE:
win32api.SetConsoleTitle(SCRIPT_TITLE)
if not keep_output:
win32gui.ShowWindow(main_hwnd, win32con.SW_HIDE)
root = tkinter.Tk()
root.withdraw() # Скроем основное окно до прорисовки точно в центре экрана (делаем видимым методом update_application_window)
# Важно! Шрифт моноширинный
font_sizes = [(0, 8), (480, 10), (864, 12)]
font = ("Lucida Console", font_sizes[bisect.bisect(font_sizes,
(root.winfo_screenheight(), float("inf"))) - 1][1], "normal")
app = Application(master=root)
app.mainloop()
try:
root.destroy()
except tkinter.TclError:
pass
Повторюсь Подробно со стандартом FIDO2 не разбирался, знаю, что опубликованы варианты MitM атак, но для этого злоумышленник уже должен хозяйничать в системе. А тогда ему без разницы есть аппаратные токены или нет: украдёт сессионные куки условно и будет контролировать ситуацию. Вообще известно, что аппаратные токены хорошо защищают только от удалённого злоумышленника, и они только для этого и предназначены. От разного рода специалистов по взлому близкого окружения не защитят. Можно ли защитить своё устройство от злонамеренного воздействия? Наверно, слишком смело утверждать, что это ваше устройство, учитывая, что у разного рода злоумышленников условно есть немало вариантов достичь разнообразных целей :) Это старая проблема: дверной замок спасает от шпаны условно, а какие-то системы защиты (особенно уровня не выше домашнего антивируса) и знания пользователей - от скрипт-кидди только, наверно. Если кто-то из сколько-нибудь грамотных мотивированных специалистов проявит к вам интерес, всё что захотят, то и сделают с вашими данными/деньгами и вы этого не заметите, ну разве что они сами захотят обратить на это ваше внимание. На известное соотношение стоимости защищаемых данных и стоимости взлома ориентироваться тоже не всегда можно: могут попасться условно "идейные хакеры" :) Так что если хочется что-то защитить, то не стоит пользоваться техническими средствами вообще, паролей лучше не помнить, а в надёжных сейфах ничего кроме водки не хранить :)
Мне кажется не настолько всё плохо в этой технологии :) У меня нет необходимых компетенций, чтобы как-то подтвердить или опровергнуть, но, насколько понимаю, технология достаточно хорошо описана и у специалистов не вызывает нареканий. Что касается реальных проблем: у Yubiko, вроде были обнаружены недостатки в прошивке, которые позволяли весьма непростым образом обойти защиту, в результате все новые ключи выпускаются с обновлённой прошивкой. Ну и всё что связано с постквантовой криптографией условно может вызвать обеспокоенности в перспективе.
Насколько понимаю, каждый раз генерируется некая условно абстрактная пара ключей и как-то при этом вам понятным образом называется, потом открытый отправляется в нужное место на удалённом сервере и именно по открытому ключу при подключении потом определяется, какой использовать из приватных. Приватный состоит вроде из двух частей: одна хранится на компьютере, другая на токене. Подробностей не приведу. Вставленный в USB порт компьютера аппаратный токен при подключении работает так: операционной системой запрашивается PIN-код, если он совпал, проверяется ваше присутствие - нужно прикоснуться к площадке возле мигающего светодиода, если PIN-код не подошёл (он на весь токен задаётся), повторный запрос, если сколько-то попыток превышено, токен блокируется и всё на нём нужно будет стирать для продолжения работы. Но сначала, насколько помню, предлагается отключить/подключить токен и перезагрузить компьютер. Вроде, ничего не пропустил. Если ошибся, надеюсь поправит кто. Это всё про ssh только. Такие вещи, как VK ID, Яндекс ID подключаются стандартным образом через сайт, который это умеет, но иногда требуется создавать ключи только через телефон, хотя потом и через компьютер всё работает.
Я вот наблюдаю за ситуацией в разных областях знаний. Теперь вроде бы стали ответственней подходить к публикациям в СМИ материалов, способных вызвать разного рода негативные последствия из-за условно распространения недостаточно выверенной информации на широком информационном поле, по крайней мере в официальных изданиях. Вот и после этой публикации и привлечения внимания к проблеме, редакторы возможно также добавят для себя, о чём не стоит широко распространять непроверенную информацию.
Насколько помню, там угрозы другие на самом деле могут быть: получение не голоса, а приватной информации для подготовки атаки условно (то есть вполне обычный алгоритм защиты и тогда говорить вполне можно), но статистики нет у меня, хотя на ресурсах по безопасности информация проходила. Лучше у специалистов узнать, насколько распространено. Потенциальных угроз много, а вот реализуются массово очень небольшая часть исходя из той статистики, что мне известна. Люди имеющие много денег, уже достаточно защищены должны быть, наверное, но и так не будут участвовать в опросе такого рода - слишком уж их ответы могут отличаться от ожидаемых, к тому же их по пальцам перечесть и если уж важно их мнение - можно, наверно, заранее договориться. А остальным даже и в описанном варианте вероятная атака не так страшна, наверно. Это навскидку общие размышления по теме.
Добавлю, что Рутокен MFA может содержать только до 16 пар закрытый+открытый ключ (не берусь считать это серьёзным ограничением для всех), Yubikey Security Key - до 25 (тоже недорогой относительно, поскольку там только U2F/FIDO2 аутентификация реализована). На сайте Рутокен даже инструкция есть: https://dev.rutoken.ru/pages/viewpage.action?pageId=164200455 Наверно, не совсем Offtop будет, если кто подскажет: вот у меня на GitHub доступ по ssh может быть по основному и резервному аппаратному токену, переключение батником:
@echo off
setlocal
set key=id_ecdsa_sk
if exist %ssh_path%\%key% if exist %ssh_path%\%key%.pub if not exist %ssh_path%\%key%_1 if not exist %ssh_path%\%key%_1.pub if exist %ssh_path%\%key%_2 if exist %ssh_path%\%key%_2.pub (
call :swap 2 1
echo Set to Yubikey Security Key
ping 127.0.0.1 -n 3 >nul
echo
exit /b
)
if exist %ssh_path%\%key% if exist %ssh_path%\%key%.pub if not exist %ssh_path%\%key%_2 if not exist %ssh_path%\%key%_2.pub if exist %ssh_path%\%key%_1 if exist %ssh_path%\%key%_1.pub (
call :swap 1 2
echo Set to Рутокен MFA
exit /b
)
:swap
ren %ssh_path%\%key% %key%_%2
ren %ssh_path%\%key%.pub %key%_%2.pub
ren %ssh_path%\%key%_%1 %key%
ren %ssh_path%\%key%_%1.pub %key%.pub
Что-то упустил в плане безопасности, например, или вполне рабочий вариант?
А вот мне кажется, что основной сложностью может стать массовая перенастройка аппаратных ключей и passkeys (у меня статистики нет, поэтому количественно мой прогноз может быть сильно не точным). Без сохранения обратной совместимости в один прекрасный момент они перестанут работать, а кто-то не узнает, пока не столкнётся с проблемами. Я вот посмотрел, у меня на Рутокен MFA для VK ID используется почта на gmail. Насчёт passkeys только общие соображения, но, наверно, кто-то точно может знать и поправит, если я ошибся. И да, у меня ещё VK почта на vk.com, что насчёт неё будет с таким подходом, даже боюсь предположить :)
Сайт был на Джанго и sitemap.xml формировался автоматически со всеми настройками. Не слежу за ситуацией, но на тот момент было достаточно удобно и быстро. Если механизм работает и сейчас, в некоторых случаях вполне можно на него ориентироваться наверно.
Мне кажется, социальные рейтинги уже во всю достаточно давно и повсеместно применяются. Навскидку: деньги, звания, в том числе и научные, и для деятелей культуры. Деньги как мера возможного влияния на какие-то процессы. Наверно, кто обладает навыками управления (своими финансами в том числе в плане инвестиций, например), тому рейтинг (количество доступных денег), считается, похоже, может быть повышен. Подразумевается, что человек при этом мотивирован стремиться к вершине рейтинга. Но на практике всё не совсем так :) Вот, мошенники судя по всему имеют высокий социальный рейтинг :) А может, они важны? Мотивируют учиться? Я не утверждаю, что в коротком посте всю сложность ситуации затронул, но небольшую часть возможного направления размышлений обозначил, наверно :) Потому что если дальше пойти в анализе дошедших до нас (вероятно, искажённых через призму условно "правых актёров, играющих левые роли") данных о стране победившего социализма, похоже, очень интересные устойчивые конструкции на некоторых "культурных слоях" вырисовываются... Не настаиваю на подобной точке зрения, просто упомянул "к слову", что и такой подход в некоторых случаях может быть вполне, наверно, принят во внимание.
Интересно, добавят ли некоторый "банковский" функционал - возможность подтвердить, какие СИМки привязаны в разных банках? У меня в банках используется два номера телефона: один личный, другой самозанятого и только Сбер проверил и знает при переводах по СБП, что оба - мои номера. Остальные банки считают, что у человека может быть только один номер телефона, причём иногда только тот, что указан основным на Госуслугах. Если только самый крупный банк смог такую задачу решить, а у других проблемы, может, централизация через Госуслуги как-то поможет? Впрочем, это только общие размышления: я не оценивал никак безопасность такого рода реализации.
Я в начале и подчеркнул, что если все придут к соглашению, что так правильно, то да. Но не уверен, что до диалога по этому вопросу вообще дойдёт. Я пока наблюдаю для проблемных приложений, какое через какой магазин лучше обновлять и там разрешаю автообновление, в остальных запрещаю. Насчёт того, что у приложения в атрибутах значится, откуда оно установлено: насколько помню, Samsung Galaxy Store на это не особенно смотрит, если может обновить, но уж больно редко предлагает обновления. Хотя на днях наотрез отказался некое приложение обновлять у меня. Вообще, я из Galaxy Store кроме их фирменных и не ставил ничего, но в атрибутах много где указано, что оттуда поставлено, насколько помню. Есть ещё приложения, которые сами по себе (без магазинов) обновляются и даже требуют такое включить в настройках, в то же время и из магазинов обновляются прекрасно. В общем, даже если стандарт разработать, кто его соблюдать будет? Боюсь, что энтузиасты какие только. Могут быть, наверно, некие идеальные решения, но в текущей ситуации почти любое из них скорее недостижимо. Приходится приспосабливаться к тому, что есть. А разве в реальном мире не так? У каждого условно "законодателя" своё видение и свой сценарий, который "единственно верен". И тогда с этой точки зрения ситуация с магазинами приложений является своего рода неким "обучающим спектаклем". А когда "надстройка" соответствует "базису" (в моём понимании Марксовой философии), это, наверно, в общем не плохо. Отвлёкся. Но по теме магазинов приложений высказал, вроде, всё, что хотел.
Мне кажется, похоже, тут проблема более серьёзная: если бы одновременно все магазины приложений могли такое реализовать, тогда да. Потому что, например, у меня установлено много приложений, которые и через любой из нескольких магазинов прекрасно обновляются, но есть и те, что только через определённый. В других тогда автоматическое обновление вручную отключаю, как и вы. Согласен, что не удобно это. Вот ещё что для разработчиков можно было бы предложить: регламент публикации, скажем, в одном магазине публиковать в приоритетном порядке, в другом, например, через неделю, в третьем - ещё через некоторый промежуток, но для нормальной работы в этом случае нужно очень хорошо понимать политику развёртывания у каждого магазина и она должна быть стационарной/стабильной. Тогда всё со временем может прийти к некоторому устойчивому состоянию. Не уверен, что сработает, но со стороны на первый взгляд может показаться логичным.
Аппаратные ключи у Yubikey разные бывают. Мне достаточно Security Key, а значит и российского аналога Рутокен MFA. Оба есть у меня. Используются как passkey на телефоне и компе с Windows Hello. В обоих реализован стандарт не только U2F, но, что важнее, FIDO2. Можно использовать для входа в аккаунты Google, Microsoft, GitHub, VK ID, Яндекс ID, правда без "танцев с бубном" с использованием смартфона у меня не получилось доступ к российским ID получить. Даже небольшую статью написал на Дзене по этому поводу, а на Хабре и до того и после комментировал несколько раз. Но доступа по FIDO2 этих аппаратных ключей недостаточно для интеграции с GnuPG Kleopatra, хотя доступ к GitHub по SSH вполне работает, я выбрал вариант с вводом PIN кода. Что касается менеджера паролей, использую KeePass и keepass2android. В первом желательно настроить по инструкции функцию деривации ключа Argon2id и ещё несколько настроек сделать, в числе которых защищённый рабочий стол и запрет снятия скриншотов, во втором настроить использование защищенной клавиатуры, идущей в комплекте, чтобы пароли и TOTP передавались не через буфер обмена. Недавно был глюк у приложения для смартфона при доступе к Google Диску (а система безопасности Google не считала и, вроде, не считает автора этой реализации менеджера паролей доверенным разработчиком), но в облаках Dropbox и Microsoft OneDrive пока всё работает. Из платных менеджеров паролей с подобным функционалом Kaspersky Password Manager вполне может устроить. И TOTP тоже умеет. Это то, чем пользуюсь постоянно.
Поправил скрипт: там что-то с bom посреди файла, похоже, было. Не стал разбираться почему, просто подкорректировал. Понимаю, что стиль - не идеальный (в частности короткие названия переменных их повторное использование {впрочем, наверно, не только это}), но как привык :)
var fso = new ActiveXObject("Scripting.FileSystemObject"), fn;
var a = WSH.Arguments; if(a.length){
var s = fso.OpenTextFile(fn=(a.UnNamed.Item(0)), 1, false, -2).ReadAll();
s = s.replace(/(table.tableWithBorder.*font-size:)41px/, "$125px")
.replace(/ style="min-width:\d+px"/gi, "")
.replace(/ style="height:113px"/i, "")
.replace(/ style="height:75px"/gi, "")
.replace(/(id="tableTitleDiv".*Заметки)/i, "$1");
s = s.replace(RegExp.$1, RegExp.$1.replace(/width:\d+px;/gi, ""));
s = s.replace(/��/gi, "*");
var w = s.split(/[^а-яА-Я0-9*]+/g).slice();
var f = [];
for(var i=0;i<w.length;i++){
if(/\D+/i.test(e=w[i])){var r=false;
for(var j=0;j<f.length;j++){
if(f[j]===e){r=true;break;}
}
if(!r)f.push(e);
}
}
w = "-" + f.join("-") + "-";
for(var i=0;i<f.length;i++){
if(/\*/.test(e=f[i])){
r = [e, (new RegExp("-("+e.replace(/\*/, "[^*]")+")-").exec(w), RegExp.$1?RegExp.$1:"Активный")];
s = s.replace(r[0], r[1]);
}
}
fso.OpenTextFile(fn.replace(/[_.](html)$/, " (вариант для печати).$1"), 2, true, -2).Write(s);
}
Поделюсь опасениями. Я в 2011 году, когда один из сайтов переехал на другой домен, не помню уж по какой причине (вроде, там за домен или хостинг забыли заплатить, а у меня были ссылки в файлике на отдельные странички) набросал вот такой скрипт, как раз с заменой содержимого буфера обмена "на лету":
var tStop=new Date;tStop.setSeconds(tStop.getSeconds()+30);
with(WScript.CreateObject("AutoItX3.Control"))while(tStop-(new Date)>0){ch=false;
var newURL=repl(ClipGet(),/((?:forum\.|www\.)?script-coding\.)info/gi,'$1com');
newURL=repl(newURL,/p10903\.clients\.m-10\.ru/gi,'forum.script-coding.com');
if(newURL && ch)ClipPut(newURL);
Sleep(500);
}
var i=2;with(new ActiveXObject("WScript.Shell"))while(i--)Run('cmd /c @echo ',0,true);
function repl(s,re,rs){if(re.test(s)){ch=true;return s.replace(re,rs)};return s}
С тех пор к подобными подходам есть некоторый интерес. Результаты наблюдений за ситуацией на настоящий момент такие: оказалось, что подобная техника используется злоумышленниками при краже денег с криптокошельков. То есть пользователь копирует в буфер обмена одно, а незаметно для него туда вставляется другое, в результате деньги уходят на сторону. Я не говорю, что использовать автоматическую модификацию буфера обмена нельзя, но отношусь теперь к подобного рода вещам с чрезвычайной настороженностью. Ни к чему не призываю, просто информирую...
Извиняюсь, конечно, что не совсем по теме, но у меня на JS (WSH на Винде, с Висты, вроде), вот такое решение было и сейчас пользуюсь. Я к чему: не сталкивался тогда в Линуксе с подобной проблемой (если скачивал там, на винду перебрасывал сразу), но на Винде длительность видео можно выцепить через метод GetDetailsOf объекта "Shell.Application" ("Описание: возвращается информация, похожая на ту, что можно увидеть в окне свойств файла (папки) в проводнике"). И повторюсь, насколько помню (давно было), из Линукса данные передавались уже с этими свойствами файла. Скрипт своеобразный - рассчитан под нумерованные папки (оцифровывал VHS кассеты изначально, теперь только при скачивании через yt-dlp использую - он умеет разбивать на фрагменты почти хорошо, а с нужными параметрами почти идеально), но легко поправить. Может, без ffprobe можно и на линуксе обойтись? Давно с ним не работал.
Те, кот использовал Защищённую папку, не рутовал, насколько знаю. Там в этом случае аппаратный предохранитель пережигался и доступ к папке блокировался бы. Я Защищённую папку использую: Госключ там у меня и ЮKassa (они приложение для самозанятых не сделали, только для ЮЛ/ИП, а некоторой минимальной безопасности хочется :) С выходом One UI 7.0 в Samsung резко гайки закрутили. Раньше из Защищённой папки можно было в основное пространство телефона отправлять файлы/ссылки в любое приложение, а теперь только через Быструю отправку - фактически через ссылку в их облаке с ограниченным сроком доступа (можно перекрыть доступ и раньше). Насколько помню, Защищенная папка одобрена DoD и Бундесвером, но надо понимать все ограничения (а они есть) и уметь пользоваться. Но понимаю, что не всем подойдёт, а меня устраивает.
Тоже как-то оцифровывал подобным образом. С шестиголовочного магнитофона захватывал YPbPr сигнал бехолдером 8 (PCI-e 1x). Насколько помню, пришел также в конце концов к захвату в lossless ASF, при записи вручную подстраивал фильтры (нужно было для лучшего качества смотреть на изменение картинки), деинтерлейс делал "на лету" (из всех вариантов, доступных на сайте, был один более или менее подходящий по качеству, как мне показалось), критичной при этом была нагрузка на процессор, настройки фильтров подбирались в том числе исходя из этого. Потом конвертировал ffmpeg в x264 -crf 18. Сейчас, правда при необходимости перекодирую видео видеокартой Nvidia - это намного быстрее, качество вполне устраивает. А в начале захватывал в AVI. Видео со звуком всегда расходилось при этом, причём, насколько помню каждый раз по-разному. Даже скрипт для корректировки расхождения на пайтоне написал исходя из предположения о линейной зависимости, пока не пришёл к описанному выше варианту.
Скрипт: VirtualDub.py
Повторюсь Подробно со стандартом FIDO2 не разбирался, знаю, что опубликованы варианты MitM атак, но для этого злоумышленник уже должен хозяйничать в системе. А тогда ему без разницы есть аппаратные токены или нет: украдёт сессионные куки условно и будет контролировать ситуацию. Вообще известно, что аппаратные токены хорошо защищают только от удалённого злоумышленника, и они только для этого и предназначены. От разного рода специалистов по взлому близкого окружения не защитят. Можно ли защитить своё устройство от злонамеренного воздействия? Наверно, слишком смело утверждать, что это ваше устройство, учитывая, что у разного рода злоумышленников условно есть немало вариантов достичь разнообразных целей :) Это старая проблема: дверной замок спасает от шпаны условно, а какие-то системы защиты (особенно уровня не выше домашнего антивируса) и знания пользователей - от скрипт-кидди только, наверно. Если кто-то из сколько-нибудь грамотных мотивированных специалистов проявит к вам интерес, всё что захотят, то и сделают с вашими данными/деньгами и вы этого не заметите, ну разве что они сами захотят обратить на это ваше внимание. На известное соотношение стоимости защищаемых данных и стоимости взлома ориентироваться тоже не всегда можно: могут попасться условно "идейные хакеры" :) Так что если хочется что-то защитить, то не стоит пользоваться техническими средствами вообще, паролей лучше не помнить, а в надёжных сейфах ничего кроме водки не хранить :)
Мне кажется не настолько всё плохо в этой технологии :) У меня нет необходимых компетенций, чтобы как-то подтвердить или опровергнуть, но, насколько понимаю, технология достаточно хорошо описана и у специалистов не вызывает нареканий. Что касается реальных проблем: у Yubiko, вроде были обнаружены недостатки в прошивке, которые позволяли весьма непростым образом обойти защиту, в результате все новые ключи выпускаются с обновлённой прошивкой. Ну и всё что связано с постквантовой криптографией условно может вызвать обеспокоенности в перспективе.
Насколько понимаю, каждый раз генерируется некая условно абстрактная пара ключей и как-то при этом вам понятным образом называется, потом открытый отправляется в нужное место на удалённом сервере и именно по открытому ключу при подключении потом определяется, какой использовать из приватных. Приватный состоит вроде из двух частей: одна хранится на компьютере, другая на токене. Подробностей не приведу. Вставленный в USB порт компьютера аппаратный токен при подключении работает так: операционной системой запрашивается PIN-код, если он совпал, проверяется ваше присутствие - нужно прикоснуться к площадке возле мигающего светодиода, если PIN-код не подошёл (он на весь токен задаётся), повторный запрос, если сколько-то попыток превышено, токен блокируется и всё на нём нужно будет стирать для продолжения работы. Но сначала, насколько помню, предлагается отключить/подключить токен и перезагрузить компьютер. Вроде, ничего не пропустил. Если ошибся, надеюсь поправит кто. Это всё про ssh только. Такие вещи, как VK ID, Яндекс ID подключаются стандартным образом через сайт, который это умеет, но иногда требуется создавать ключи только через телефон, хотя потом и через компьютер всё работает.
Я вот наблюдаю за ситуацией в разных областях знаний. Теперь вроде бы стали ответственней подходить к публикациям в СМИ материалов, способных вызвать разного рода негативные последствия из-за условно распространения недостаточно выверенной информации на широком информационном поле, по крайней мере в официальных изданиях. Вот и после этой публикации и привлечения внимания к проблеме, редакторы возможно также добавят для себя, о чём не стоит широко распространять непроверенную информацию.
Насколько помню, там угрозы другие на самом деле могут быть: получение не голоса, а приватной информации для подготовки атаки условно (то есть вполне обычный алгоритм защиты и тогда говорить вполне можно), но статистики нет у меня, хотя на ресурсах по безопасности информация проходила. Лучше у специалистов узнать, насколько распространено. Потенциальных угроз много, а вот реализуются массово очень небольшая часть исходя из той статистики, что мне известна. Люди имеющие много денег, уже достаточно защищены должны быть, наверное, но и так не будут участвовать в опросе такого рода - слишком уж их ответы могут отличаться от ожидаемых, к тому же их по пальцам перечесть и если уж важно их мнение - можно, наверно, заранее договориться. А остальным даже и в описанном варианте вероятная атака не так страшна, наверно. Это навскидку общие размышления по теме.
Добавлю, что Рутокен MFA может содержать только до 16 пар закрытый+открытый ключ (не берусь считать это серьёзным ограничением для всех), Yubikey Security Key - до 25 (тоже недорогой относительно, поскольку там только U2F/FIDO2 аутентификация реализована). На сайте Рутокен даже инструкция есть: https://dev.rutoken.ru/pages/viewpage.action?pageId=164200455 Наверно, не совсем Offtop будет, если кто подскажет: вот у меня на GitHub доступ по ssh может быть по основному и резервному аппаратному токену, переключение батником:
Что-то упустил в плане безопасности, например, или вполне рабочий вариант?
А вот мне кажется, что основной сложностью может стать массовая перенастройка аппаратных ключей и passkeys (у меня статистики нет, поэтому количественно мой прогноз может быть сильно не точным). Без сохранения обратной совместимости в один прекрасный момент они перестанут работать, а кто-то не узнает, пока не столкнётся с проблемами. Я вот посмотрел, у меня на Рутокен MFA для VK ID используется почта на gmail. Насчёт passkeys только общие соображения, но, наверно, кто-то точно может знать и поправит, если я ошибся. И да, у меня ещё VK почта на vk.com, что насчёт неё будет с таким подходом, даже боюсь предположить :)
Я более десяти лет назад "ускорял" индексирование, запуская ярлык на следующий адрес:
Сайт был на Джанго и sitemap.xml формировался автоматически со всеми настройками. Не слежу за ситуацией, но на тот момент было достаточно удобно и быстро. Если механизм работает и сейчас, в некоторых случаях вполне можно на него ориентироваться наверно.
Мне кажется, социальные рейтинги уже во всю достаточно давно и повсеместно применяются. Навскидку: деньги, звания, в том числе и научные, и для деятелей культуры. Деньги как мера возможного влияния на какие-то процессы. Наверно, кто обладает навыками управления (своими финансами в том числе в плане инвестиций, например), тому рейтинг (количество доступных денег), считается, похоже, может быть повышен. Подразумевается, что человек при этом мотивирован стремиться к вершине рейтинга. Но на практике всё не совсем так :) Вот, мошенники судя по всему имеют высокий социальный рейтинг :) А может, они важны? Мотивируют учиться? Я не утверждаю, что в коротком посте всю сложность ситуации затронул, но небольшую часть возможного направления размышлений обозначил, наверно :) Потому что если дальше пойти в анализе дошедших до нас (вероятно, искажённых через призму условно "правых актёров, играющих левые роли") данных о стране победившего социализма, похоже, очень интересные устойчивые конструкции на некоторых "культурных слоях" вырисовываются... Не настаиваю на подобной точке зрения, просто упомянул "к слову", что и такой подход в некоторых случаях может быть вполне, наверно, принят во внимание.
Интересно, добавят ли некоторый "банковский" функционал - возможность подтвердить, какие СИМки привязаны в разных банках? У меня в банках используется два номера телефона: один личный, другой самозанятого и только Сбер проверил и знает при переводах по СБП, что оба - мои номера. Остальные банки считают, что у человека может быть только один номер телефона, причём иногда только тот, что указан основным на Госуслугах. Если только самый крупный банк смог такую задачу решить, а у других проблемы, может, централизация через Госуслуги как-то поможет? Впрочем, это только общие размышления: я не оценивал никак безопасность такого рода реализации.
Я в начале и подчеркнул, что если все придут к соглашению, что так правильно, то да. Но не уверен, что до диалога по этому вопросу вообще дойдёт. Я пока наблюдаю для проблемных приложений, какое через какой магазин лучше обновлять и там разрешаю автообновление, в остальных запрещаю. Насчёт того, что у приложения в атрибутах значится, откуда оно установлено: насколько помню, Samsung Galaxy Store на это не особенно смотрит, если может обновить, но уж больно редко предлагает обновления. Хотя на днях наотрез отказался некое приложение обновлять у меня. Вообще, я из Galaxy Store кроме их фирменных и не ставил ничего, но в атрибутах много где указано, что оттуда поставлено, насколько помню. Есть ещё приложения, которые сами по себе (без магазинов) обновляются и даже требуют такое включить в настройках, в то же время и из магазинов обновляются прекрасно. В общем, даже если стандарт разработать, кто его соблюдать будет? Боюсь, что энтузиасты какие только. Могут быть, наверно, некие идеальные решения, но в текущей ситуации почти любое из них скорее недостижимо. Приходится приспосабливаться к тому, что есть. А разве в реальном мире не так? У каждого условно "законодателя" своё видение и свой сценарий, который "единственно верен". И тогда с этой точки зрения ситуация с магазинами приложений является своего рода неким "обучающим спектаклем". А когда "надстройка" соответствует "базису" (в моём понимании Марксовой философии), это, наверно, в общем не плохо. Отвлёкся. Но по теме магазинов приложений высказал, вроде, всё, что хотел.
Мне кажется, похоже, тут проблема более серьёзная: если бы одновременно все магазины приложений могли такое реализовать, тогда да. Потому что, например, у меня установлено много приложений, которые и через любой из нескольких магазинов прекрасно обновляются, но есть и те, что только через определённый. В других тогда автоматическое обновление вручную отключаю, как и вы. Согласен, что не удобно это. Вот ещё что для разработчиков можно было бы предложить: регламент публикации, скажем, в одном магазине публиковать в приоритетном порядке, в другом, например, через неделю, в третьем - ещё через некоторый промежуток, но для нормальной работы в этом случае нужно очень хорошо понимать политику развёртывания у каждого магазина и она должна быть стационарной/стабильной. Тогда всё со временем может прийти к некоторому устойчивому состоянию. Не уверен, что сработает, но со стороны на первый взгляд может показаться логичным.
Сейчас модно в версию ставить Год/месяц. У LibreOffice теперь так же :)
Аппаратные ключи у Yubikey разные бывают. Мне достаточно Security Key, а значит и российского аналога Рутокен MFA. Оба есть у меня. Используются как passkey на телефоне и компе с Windows Hello. В обоих реализован стандарт не только U2F, но, что важнее, FIDO2. Можно использовать для входа в аккаунты Google, Microsoft, GitHub, VK ID, Яндекс ID, правда без "танцев с бубном" с использованием смартфона у меня не получилось доступ к российским ID получить. Даже небольшую статью написал на Дзене по этому поводу, а на Хабре и до того и после комментировал несколько раз. Но доступа по FIDO2 этих аппаратных ключей недостаточно для интеграции с GnuPG Kleopatra, хотя доступ к GitHub по SSH вполне работает, я выбрал вариант с вводом PIN кода. Что касается менеджера паролей, использую KeePass и keepass2android. В первом желательно настроить по инструкции функцию деривации ключа Argon2id и ещё несколько настроек сделать, в числе которых защищённый рабочий стол и запрет снятия скриншотов, во втором настроить использование защищенной клавиатуры, идущей в комплекте, чтобы пароли и TOTP передавались не через буфер обмена. Недавно был глюк у приложения для смартфона при доступе к Google Диску (а система безопасности Google не считала и, вроде, не считает автора этой реализации менеджера паролей доверенным разработчиком), но в облаках Dropbox и Microsoft OneDrive пока всё работает. Из платных менеджеров паролей с подобным функционалом Kaspersky Password Manager вполне может устроить. И TOTP тоже умеет. Это то, чем пользуюсь постоянно.
В конце добавить глобализма нужно :)
Поправил скрипт: там что-то с bom посреди файла, похоже, было. Не стал разбираться почему, просто подкорректировал. Понимаю, что стиль - не идеальный (в частности короткие названия переменных их повторное использование {впрочем, наверно, не только это}), но как привык :)
Поделюсь опасениями. Я в 2011 году, когда один из сайтов переехал на другой домен, не помню уж по какой причине (вроде, там за домен или хостинг забыли заплатить, а у меня были ссылки в файлике на отдельные странички) набросал вот такой скрипт, как раз с заменой содержимого буфера обмена "на лету":
С тех пор к подобными подходам есть некоторый интерес. Результаты наблюдений за ситуацией на настоящий момент такие: оказалось, что подобная техника используется злоумышленниками при краже денег с криптокошельков. То есть пользователь копирует в буфер обмена одно, а незаметно для него туда вставляется другое, в результате деньги уходят на сторону. Я не говорю, что использовать автоматическую модификацию буфера обмена нельзя, но отношусь теперь к подобного рода вещам с чрезвычайной настороженностью. Ни к чему не призываю, просто информирую...